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

Kivy中跨类调用Widget类函数无响应的问题求助

解决Kivy中跨类调用Widget函数无响应的问题

问题根源

你代码里的核心问题是Tryer.prot()方法中创建了新的MyLayout实例,而不是操作界面上已经存在的那个实例。调用新实例的play_activator()自然不会影响到界面上的按钮——这两个是完全独立的对象,新实例根本没被添加到界面中,所以修改它的控件属性不会有任何视觉反馈。

解决方案1:传递实例(推荐)

通过在打开Popup时将当前MyLayout实例传递给Tryer,直接操作真实界面上的对象:

  1. 修改MyLayout.op()方法,传递自身实例:
def op(self):
    den = Tryer(my_layout=self)
    den.open()
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:41