如何通过kivy从def中的其他类访问变量?

时间:2019-01-04 21:55:01

标签: python kivy

问题

我正在使用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

.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)

2 个答案:

答案 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)