如何在Kivy的for循环中为每个Label分配ID?
给循环创建的Label添加标识以便后续修改
你可以通过两种方式实现这个需求,直接看修改后的代码和说明:
方法一:利用Kivy自带的ids字典
Kivy的Widget类自带ids属性,你可以在创建Label时指定唯一的id,后续通过self.ids[id名称]直接访问对应的Label:
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.metrics import dp # 原代码漏导入了dp,必须加上 class WordLabel(GridLayout): def __init__(self, **kwargs): super(WordLabel, self).__init__(**kwargs) self.cols = 5 self.rows = 6 self.spacing = 5 self.pos_hint = {"center_x": .5} for i in range(0, 30): label = Label( id=f"label_{i}", # 给每个Label设置唯一id pos_hint={"center_x": 0.5}, text=str(i+1), size_hint=(dp(10), dp(10)), color=(0, 0, 0, 1), ) self.add_widget(label) # 示例:修改第3个Label的文本和颜色 self.ids["label_2"].text = "修改后的文本" self.ids["label_2"].color = (1, 0, 0, 1) class WORDOLE5App(App): def build(self): return WordLabel() # 这里要返回WordLabel实例,原代码没写,运行会空白 WORDOLE5App().run()
方法二:自行维护Label实例字典
如果不想依赖Kivy的ids,可以在类里自己定义一个字典来存储每个Label,后续通过字典键值对访问:
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.metrics import dp class WordLabel(GridLayout): def __init__(self, **kwargs): super(WordLabel, self).__init__(**kwargs) self.cols = 5 self.rows = 6 self.spacing = 5 self.pos_hint = {"center_x": .5} self.labels = {} # 自定义字典存储Label for i in range(0, 30): label = Label( pos_hint={"center_x": 0.5}, text=str(i+1), size_hint=(dp(10), dp(10)), color=(0, 0, 0, 1), ) self.add_widget(label) self.labels[i] = label # 将Label存入字典,用循环索引当键 # 示例:修改第5个Label的文本 self.labels[4].text = "自定义字典修改" class WORDOLE5App(App): def build(self): return WordLabel() WORDOLE5App().run()
注意:原代码里有两个问题必须修正才能正常运行:
- 缺少
dp的导入语句,会导致运行报错 WORDOLE5App类没有实现build方法返回Widget实例,运行后会显示空白窗口
内容的提问来源于stack exchange,提问作者gwadhalp
相关产品推荐
相关产品推荐

