Kivy 从另一个 class 调用 SELF 方法

Kivy call SELF method from another class

在这个非常简单的 kivy python 程序中,我尝试使用 Window1 class 中的方法更改 Window2 class 中的文本标签。 当我在 Window2 中调用 Window1 方法时,方法已启动,但 self.ids .... 行未完成。

知道必须更改什么才能使 self.ids.label1.text = "DONE" 正常工作吗?

python 文件

from kivy.uix.boxlayout import BoxLayout


class ParentWindow(BoxLayout):
    pass


class Window1(BoxLayout):

    def update(self):
        print("This print works, but next line not ...")
        self.ids.label1.text = "DONE"


class Window2(BoxLayout):

    def try_change(self):
        Window1().update()


class MyProgramApp(App):
    def build(self):
        return ParentWindow()


MyProgramApp().run()

kivy 文件

<ParentWindow>:
    Window1:
    Window2:

<Window1>:
    orientation: "vertical"
    Label:
        id: label1
        text: "Try to change me"
    Button:
        text: "Works fine from self class"
        on_press: root.update()

<Window2>:
    Button:
        text: "Lets try"
        on_press: root.try_change()

只要您的代码中有一个 class 名称后跟 (),您就在创建该 class 的一个新实例。因此 try_change() 方法中的 Window1().update() 正在创建 Window1 的新实例(与 GUI 中的实例无关),并在该新实例上调用 update()。这不会影响您在 GUI 中看到的内容。

您需要访问 GUI 中实际存在的 Window1 实例。为此,您可以将 try_change() 更改为:

def try_change(self):
    # Window1().update()
    window1 = App.get_running_app().root.ids.window1
    window1.update()

在您的 kv 中添加 window1 id:

<ParentWindow>:
    Window1:
        id: window1
    Window2:

我找到了解决方案:

.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class ParentWindow(BoxLayout):
    pass


class Window1(BoxLayout):

    def update(self):
        print("This print work, but next line not ...")
        self.ids.label1.text = "DONE"


class Window2(BoxLayout):

    def try_change(self):
        self.parent.ids.win1.update()


class MyProgramApp(App):
    def build(self):
        return ParentWindow()


MyProgramApp().run()

.kv

<ParentWindow>:
    Window1:
        id: win1
    Window2:


<Window1>:
    orientation: "vertical"
    Label:
        id: label1
        text: "Try to change me"
    Button:
        text: "Works fine from self class"
        on_press: root.update()

<Window2>:
    Button:
        text: "Lets try"
        on_press: root.try_change()