如何获取Kivy按钮的显示文本,以及如何为Kivy按钮设置ID属性
问题1:获取点击按钮的文本内容
你绑定的on_press回调函数接收的obj参数就是被点击的按钮实例,直接读取obj.text属性就能拿到按钮上的候选人ID,拿到后直接修改票数字典即可,逻辑示例:
def button_clicked(self, obj): cand_id = obj.text CANDIDATES[cand_id] += 1 print(f"候选人{cand_id}当前票数:{CANDIDATES[cand_id]}")
问题2:Kivy动态创建Button设置ID的正确方式
直接给Button构造函数传id=i会报错,是因为Kivy的id属性是kv语言专属的声明字段,纯Python代码动态创建控件时,不支持直接在构造函数里传id参数。有两种常用替代方案:
- 加自定义属性存储ID:不需要走Kivy官方ids体系,使用最方便
# 创建按钮时加自定义字段 candidate = Button(text=i, on_press=self.button_clicked) candidate.cand_id = i # 回调里读取即可 def button_clicked(self, obj): cand_id = obj.cand_id - 手动存入父布局ids字典:如果需要用到Kivy原生ids体系,可以手动插入
candidate = Button(text=i, on_press=self.button_clicked) self.ids[i] = candidate
完整修正可运行代码
注:你原代码中orientation = "Vertical"首字母大写是错误写法,Kivy要求该属性值为全小写vertical,已经同步修正:
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button CANDIDATES = {"T1031" : 0,"T2112" : 0, "T4561" : 0} class MyLayout(BoxLayout): orientation = "vertical" def __init__(self, **kwargs): super(MyLayout, self).__init__(**kwargs) for cand_id in CANDIDATES: candidate = Button(text=cand_id, on_press=self.button_clicked) candidate.cand_id = cand_id self.add_widget(candidate) def button_clicked(self, obj): cand_id = obj.cand_id CANDIDATES[cand_id] +=1 print(f"候选人{cand_id}票数+1,当前总票数:{CANDIDATES[cand_id]}") class MyApp(App): def build(self): return MyLayout() if __name__ == "__main__": MyApp().run()
内容的提问来源于stack exchange,提问作者Durrin_Lorthak
相关产品推荐
相关产品推荐

