问题
我正在使用 kivy 和 ScreenManager 做一个 GUI 并使用许多屏幕。
我有一个类 Screen1,其中有一个变量,名为 num
,其值为 1。
Screen1 GUI 有一个按钮,当我按下按钮时,它调用 def calledwithbutton
将 num
变量更改为 self.num = 2
,然后将屏幕更改为屏幕 2。
Screen2 类有一个变量 var
,其值为 Screen1().num
。
Screen2 GUI 有一个标签,文本是 str(var)
预期的结果是 Screen2 GUI 标签 text = '2'
但真正的结果是屏幕 2 GUI 标签文本 = '1'
如何根据 num
变量将屏幕 2 GUI 标签文本更改为 '2'
?
.py代码
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
class Manager(ScreenManager):
pass
class Screen1(Screen):
num = 1
def calledwithbutton(self):
self.num = 2
self.parent.current = 'Screen 2'
class Screen2(Screen):
var = Screen1.num
class RootApp(App):
def build(self):
return Manager()
RootApp().run()
.kv代码
<Manager>:
Screen1:
name: 'Screen 1'
Screen2:
name: 'Screen 2'
<Screen1>:
Button:
text: 'This is a button'
on_press: root.calledwithbutton()
<Screen2>:
Label:
text: str(root.var)
最佳答案
对于这种类型的任务,您不必使用静态变量,因为它不会通知更改,在您的情况下,var 仅在创建 Screen2 对象时采用 num 的值为 1,因此它永远不会更改到 2.
在 kivy 中,这些情况的解决方案是使用 the properties ,在本例中为 NumericProperty,然后我们在属性之间进行绑定(bind)。
*.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import NumericProperty
class Manager(ScreenManager):
pass
class Screen1(Screen):
num = NumericProperty(1)
def calledwithbutton(self):
self.num = 2
self.manager.current = 'Screen 2'
class Screen2(Screen):
var = NumericProperty(0)
class RootApp(App):
def build(self):
return Manager()
if __name__ == '__main__':
RootApp().run()
*.kv
<Manager>:
Screen1:
id: screen1
name: 'Screen 1'
Screen2:
id: screen2
name: 'Screen 2'
var: screen1.num # binding
<Screen1>:
Button:
text: 'This is a button'
on_press: root.calledwithbutton()
<Screen2>:
Label:
text: str(root.var)
关于python - 如何使用 kivy 从 def 中的其他类访问变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54046638/