我正在使用kivy和ScreenManager来制作GUI并使用许多屏幕。
我有一个Screen1类,其中有一个名为num
的变量,其值为1。
Screen1 GUI有一个按钮,当我按下该按钮时,它会调用def calledwithbutton
,后者将num
变量更改为self.num = 2
,然后将屏幕更改为Screen 2。
Screen2类的变量var
的变量为Screen1().num
。
Screen2 GUI带有标签,文字为str(var)
预期结果是Screen2 GUI标签文本= '2'
但是真正的结果是,屏幕2 GUI标签文本= '1'
如何基于'2'
变量将Screen 2 GUI标签文本更改为num
?
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()
<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)
答案 0 :(得分:2)
我相信您会混淆对象和类。一个类就像一个蓝图,而一个对象就是由该蓝图构成的一个实例。
类本身通常不用于存储在程序运行期间更改的信息。
因此,如果您获取一个对象并对其进行修改,它将不会影响其他对象。如果要重用修改过的对象,则需要保护它的安全(或使用样式非常糟糕的全局变量,因此不要这样做!)。
示例:
class A:
num = 5
A() #I create an object but do not safe it (since I do not assign a variable)
A().num = 6 #will only alter the object that I just made but never assigned to a variable
print(A().num) #I print a new object (that I just make) so no 6 but a 5
a=A() #I make a object
a.num = 7 #alter something
print(a.num) #the change is saved
a=A() #I overwrite the object
print(a.num) #the change is gone
答案 1 :(得分:2)
对于这种类型的任务,您不必使用静态变量,因为该变量不会通知更改,在您的情况下,var在创建Screen2对象时仅采用num的值1,因此它永远不会更改至2。
在通常情况下,针对这些情况的解决方案是使用the properties(在本例中为NumericProperty),然后在属性之间进行绑定。
*。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)