Kivy中跨类调用Widget类函数无响应的问题求助
解决Kivy中跨类调用Widget函数无响应的问题
问题根源
你代码里的核心问题是Tryer.prot()方法中创建了新的MyLayout实例,而不是操作界面上已经存在的那个实例。调用新实例的play_activator()自然不会影响到界面上的按钮——这两个是完全独立的对象,新实例根本没被添加到界面中,所以修改它的控件属性不会有任何视觉反馈。
解决方案1:传递实例(推荐)
通过在打开Popup时将当前MyLayout实例传递给Tryer,直接操作真实界面上的对象:
- 修改
MyLayout.op()方法,传递自身实例:
def op(self): den = Tryer(my_layout=self) den.open()
- 修改
Tryer类,接收并保存传递的实例:
class Tryer(Popup): def __init__(self, my_layout, **kwargs): super().__init__(**kwargs) self.my_layout = my_layout def prot(self): self.my_layout.play_activator()
解决方案2:通过App实例获取(无需传递参数)
如果不想修改Popup的初始化逻辑,可以直接通过当前运行的App实例获取已创建的MyLayout对象:
修改Tryer.prot()方法:
from kivy.app import App class Tryer(Popup): def prot(self): # 获取当前运行的App实例 app = App.get_running_app() # 调用App中保存的MyLayout实例的方法 app.ml.play_activator()
这个方法利用了你在FirstApp.__init__中已经保存的self.ml属性,直接操作界面上的真实实例。
验证修改效果
两种方法修改后,点击Popup中的"Den"按钮,界面上的"ML"按钮文本会更新为"Changes",功能正常生效。
内容的提问来源于stack exchange,提问作者DARKTITAN
相关产品推荐
相关产品推荐

