Open
Description
The following code (supplied by todbot
on Discord and modified) shows that the bitmap_label
does not update (or very slowly/sporadically) while the "regular" version flies.
import time, board, displayio, i2cdisplaybus, terminalio
import adafruit_displayio_ssd1306
# Select one to run
# from adafruit_display_text import bitmap_label as label
from adafruit_display_text import label as label
displayio.release_displays()
dw,dh = 128, 32
i2c = board.I2C()
display_bus = i2cdisplaybus.I2CDisplayBus(i2c, device_address=0x3C)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=dw, height=dh)
display.wake()
maingroup = displayio.Group()
display.root_group = maingroup
text1 = label.Label(terminalio.FONT, text="helloworld...", x=0, y=4)
text2 = label.Label(terminalio.FONT, text="@edgjr ", x=0, y=19)
for t in (text1, text2):
maingroup.append(t)
while True:
try:
text2.text = "%.1f" % time.monotonic()
time.sleep(0.1)
except KeyboardInterrupt:
break
display.sleep()
Tested on Raspberry Pi Zero W, bookworm
32-bit
The expectation is that the behavior should be similar. I do not know if this behavior is present on other displays like this since this is the only one I have at the moment 😃
Activity
EAGrahamJr commentedon Jul 12, 2024
NOTE This is not reproducible using "plain ol'" CP -- I put the same SSD1306 display on an RP2040 via the STEMMA port with the following packages:
This suggests to me that the issue lies in the Blinka implementation of the
bitmap_label
.FoamyGuy commentedon Nov 18, 2024
Thanks for reporting @EAGrahamJr. This is an odd one. I confirmed the noted behavior and made a reproducer that draws both types on the screen and attempts to update both but only works for label, bitmap_label stays static.
Blinka and core displayio both use the same implementation of bitmap_label. The displayio system itself is where the implementations differ. In the core
displayio
is implemented in C code. For Blinka it's python code from here: https://github.com/adafruit/Adafruit_Blinka_Displayio/I'm surprised that this difference exists and applies specifically to updating labels and not setting their text the first time. My gut instinct is somehow the BitmapLabel is not getting counted as a "dirty" region that needs re-drawn. I can't really imagine why it wouldn't be though, bot BitmapLabel and Label ultimately use one or more Bitmaps and TileGrid objects internally so I would have expected them all to work the same.
I'll dig into this a bit more later and perhaps move this issue over the Blinka_Displayio repo.
reproducer script: