Kivy多组按钮关联问题求助:点击对应按钮无法修改指定行文本
问题解决:Kivy多行按钮组点击右侧按钮修改对应左侧按钮文本
问题根源
你的代码存在两个核心问题:
rename_btn方法依赖全局变量cn获取索引,但cn是当前按钮组的总数,不是点击按钮对应的组索引;同时Kivy的children列表是倒序存储(最后添加的控件排在最前面),导致无论点击哪个右侧按钮,都会定位到最早添加的左侧按钮。- 绑定按钮点击事件时,没有将当前组的左侧按钮和右侧按钮关联起来,而是用全局状态去匹配,逻辑混乱。
修复后的Python代码
from kivy.app import App from kivy.uix.screenmanager import Screen from kivy.uix.button import Button class Radiators(Screen): btn_lst = [] btn_cn_lst = [] def add_button_radiator_setting(self): # 创建左侧按钮 btn_rad = Button(text="room") self.btn_lst.append(btn_rad) self.ids.button_grid_radiators.add_widget(btn_rad) # 创建右侧按钮,绑定事件时传入对应的左侧按钮 btn_context = Button(text="...") btn_context.bind(on_press=lambda x: self.rename_btn(btn_rad)) self.btn_cn_lst.append(btn_context) self.ids.button_context_menu.add_widget(btn_context) def reject_button_radiator_setting(self): if self.btn_lst and self.btn_cn_lst: # 移除最后添加的按钮组 self.ids.button_grid_radiators.remove_widget(self.btn_lst.pop()) self.ids.button_context_menu.remove_widget(self.btn_cn_lst.pop()) def rename_btn(self, target_btn): # 直接修改传入的目标按钮文本 target_btn.text = input("enter: ") class radiatorsApp(App): pass radiatorsApp().run()
关键改动说明
- 绑定右侧按钮点击事件时,用
lambda将对应组的左侧按钮作为参数传递给rename_btn,直接建立按钮组的关联关系,彻底摆脱全局索引的依赖。 - 移除了冗余的全局计数器
i和cn,直接通过列表的pop()方法操作最后添加的元素,逻辑更简洁可靠。 rename_btn方法直接接收目标按钮对象,无需再通过索引查找,避免了children倒序带来的定位错误。
Kivy代码无需修改
你的Kivy布局代码逻辑正常,保持原样即可。
内容的提问来源于stack exchange,提问作者Dima Panasenko
相关产品推荐
相关产品推荐

