Kivy循环创建多组按钮与对应标签并绑定点击计数功能的实现问题
可运行修正代码
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.button import Button from kivy.uix.label import Label from kivy.properties import NumericProperty class MainWidget(GridLayout): label_string1 = NumericProperty(0) label_string2 = NumericProperty(0) label_string3 = NumericProperty(0) def __init__(self, **kwargs): super(MainWidget, self).__init__(**kwargs) self.cols = 2 # 存储序号对应标签实例的映射字典 self.label_map = {} for i in range(1, 4): btn = Button(text=str(i)) # 给按钮自定义属性存对应序号 btn.idx = i self.add_widget(btn) lab = Label(text="0") self.label_map[i] = lab self.add_widget(lab) btn.bind(on_press=self.btn_clicked) def btn_clicked(self, instance): # 拿到当前按钮对应序号 idx = instance.idx # 动态获取对应的NumericProperty当前值 current_val = getattr(self, f"label_string{idx}") # 计算新值 new_val = current_val + int(instance.text) # 动态更新对应的NumericProperty setattr(self, f"label_string{idx}", new_val) # 更新对应标签的文本 self.label_map[idx].text = str(new_val) class ButtonWidgetApp(App): def build(self): return MainWidget() if __name__ == '__main__': ButtonWidgetApp().run()
关键修改说明
- 动态属性操作:Python中不能直接用
self.label_string + val的形式拼接变量名访问属性,改用内置的getattr()和setattr()方法就可以通过字符串格式的属性名,动态操作你预先定义的多个NumericProperty - 关联逻辑简化:放弃原来复杂的ids存储方式,直接给按钮实例增加自定义的
idx属性存储对应组的序号,同时用label_map字典存储序号和对应标签实例的映射,点击按钮后可以直接通过序号快速定位到需要操作的属性和标签,逻辑更清晰不易出错 - 补全了Kivy应用运行必要的导入和App类的build方法,代码可直接运行
内容的提问来源于stack exchange,提问作者Hippo
相关产品推荐
相关产品推荐

