OK, can we please draw something on the display now? Not just yet. Sorry. We're close. Very close. Just one more item to talk about - the Group.
Bitmap and Palette work together to actually make colored pixels. They both get sent to a TileGrid, which allows for some fancy slicing and dicing of the bitmap (if you want to). You can have more than one TileGrid. To collect them all together for final display, you put them into a Group. You can even add a Group to a Group. This allows for some really fancy nesting and drawing.
So let's talk about the Group class. It's actually not that complex.
The Group class is pretty simple. It's just a collection of TileGrids that you have created. It also allows for nesting other Groups (subgroups) within a Group.
Once created, you add items to the Group using
insert(). You can change an item using index notation
group[index] = tilegrid. You can remove an item using
pop() or the built in
del command. In older versions of CircuitPython Group was restricted to a maximum number of items. But it's been updated to grow as new items are appended so there isn't a specific maximum any longer.
The Group will appear on the screen rooted at the location you specify with
y. All the items in the Group are positioned relative to this root location (remember TileGrid has
y also). You can also scale the entire contents of the Group using
scale. This is a simple integer scaling factor. 1 is normal, 2 is twice as big, etc.
The Group is what we will finally show on our Display. The end result looks something like this:
This shows a notional Group located at (x, y) on the Display. It contains 3 TileGrids of differing size, shape, and location. Note that the TileGrid locations, specified by their own (x, y) values, are relative to the Group. The values can be negative, like the x value for . Also note how the TileGrid stored in Group index  overlaps and is shown above the TileGrid stored in index . This is how "z ordering" works within a Group.