You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:45:04