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()
在这个非常简单的 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()