I wanted to create an interface in Python that had a row of icons at the top. Depending on the screen being displayed, I wanted one of those icons to be highlighted or a different color than the others.
This proved to be more challenging than I expected. You can set the color of all of the icons, but setting the color of a single one is a different story.
The solution that I came up with was to create a function that sets the target icon color when the program loads, rather than trying to do it as part of a KivyMD attribute of the TopAppBar widget.
def set_icon_color(self, dt):
screen_1_icon = self.screen_1.ids.menu_app_bar.ids.right_actions.children
#Tell the method where to find the homescreen icon
screen_1_icon[0].theme_icon_color = "Custom"
screen_1_icon[0].text_color = "00ADB5"
#define what the icon should look like
screen_2_icon = self.screen_2.ids.menu_app_bar.ids.right_actions.children
screen_2_icon[1].theme_icon_color = "Custom"
screen_2_icon[1].text_color = "00ADB5"
screen_2_icon = self.screen_3.ids.menu_app_bar.ids.right_actions.children
screen_3_icon[2].theme_icon_color = "Custom"
screen_3_icon[2].text_color = "00ADB5"
We call this function on program load. This sets the color of the target individual icon on each screen, without affecting the others. When I switch to any given screen, the appropriate icon is already highlighted with a distinct color.
The other thing I had to do was delay the calling of this function when the program loaded. Initially the function simply loaded when the program started, but this lead to the icons often not being highlighted because the function had fired before the icons were fully drawn.
I resolved this by using Kivy’s clock method:
Clock.schedule_icon_change(self.set_icon_color, 3)
This delays the adjusting of the icons by 3 seconds, which was all that was necessary to resolve the issue.
Leave a Reply