Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PyPortal.set_caption() always adds a new caption with no way to remove older ones? #121

Open
e28eta opened this issue Jun 21, 2022 · 0 comments

Comments

@e28eta
Copy link

e28eta commented Jun 21, 2022

I am trying to update an older PyPortal-based project, and running into a set_caption issue. It used to be that there was a single label for the caption, and its text was set during PyPortal() construction, and then could be updated later using set_caption.

Here is an example project Daily UV Index PyPortal Display that calls pyportal.set_caption() on every update, which is the same basic pattern that I've been using:
https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/9f6d3ea8f8b16d12c6fd3b89cd7ce5bbf0c015ec/PyPortal_UV_Index/code.py#L100-L102

Code with the bug

Today's implementation of PyPortal.set_caption always calls PortalBase.add_text(), and therefore it adds a new label every time:

def set_caption(self, caption_text, caption_position, caption_color):
# pylint: disable=line-too-long
"""A caption. Requires setting ``caption_font`` in init!
:param caption_text: The text of the caption.
:param caption_position: The position of the caption text.
:param caption_color: The color of your caption text. Must be a hex value, e.g.
``0x808000``.
"""
# pylint: enable=line-too-long
if self._debug:
print("Setting caption to", caption_text)
if (not caption_text) or (not self._caption_font) or (not caption_position):
return # nothing to do!
index = self.add_text(
text_position=caption_position,
text_font=self._caption_font,
text_color=caption_color,
is_data=False,
)
self.set_text(caption_text, index)

Here's a link to the add_text implementation

Old Implementation

Looking into the source history, prior to #99, the caption label was created if needed, otherwise it was updated:

def set_caption(self, caption_text, caption_position, caption_color):
# pylint: disable=line-too-long
"""A caption. Requires setting ``caption_font`` in init!
:param caption_text: The text of the caption.
:param caption_position: The position of the caption text.
:param caption_color: The color of your caption text. Must be a hex value, e.g.
``0x808000``.
"""
# pylint: enable=line-too-long
if self._debug:
print("Setting caption to", caption_text)
if (not caption_text) or (not self._caption_font) or (not caption_position):
return # nothing to do!
if self._caption:
self._caption._update_text( # pylint: disable=protected-access
str(caption_text)
)
try:
board.DISPLAY.refresh(target_frames_per_second=60)
except AttributeError:
board.DISPLAY.refresh_soon()
board.DISPLAY.wait_for_frame()
return
self._caption = Label(self._caption_font, text=str(caption_text))
self._caption.x = caption_position[0]
self._caption.y = caption_position[1]
self._caption.color = caption_color
self.splash.append(self._caption)

This is the behavior I was used to, and is still how I'd expect it to work based on today's documentation

Workaround

I think I can workaround this by ignoring the PyPortal caption, and just managing the label myself?

Fix

I'm not sure how to approach fixing this. The interaction with PortalBase makes it a little complicated. I cloned the repo with the ambition of opening a PR, but I'm not especially familiar with how other folks are using PortalBase / PyPortal.

  • could PyPortal simply remember the index of the caption? if so, how does it move the label / change the color if needed?
  • should there be a way to remove labels in PortalBase, which PyPortal could use to remove / re-create the caption when needed?
  • would remembering the caption label index be fragile - and prone to break if/when the fetched data needs more / fewer labels?
  • should the Adafruit_Learning_System_Guides code be updated to use PyPortal class / set_caption differently?
e28eta added a commit to e28eta/pyportal-aqi that referenced this issue Jun 22, 2022
- Use api.purpleair.com - old endpoint was turned off about a month ago:
https://community.purpleair.com/t/discontinuation-of-the-json-and-data-json-urls/713
- Update CircuitPython and Adafruit libraries
- unfortunately the caption code is broken, and this draws on top of itself (and will quickly exhaust the memory, I suspect). See adafruit/Adafruit_CircuitPython_PyPortal#121
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant