【问题标题】:How to acess a variable from other class inside a def with kivy?如何使用kivy从def内的其他类访问变量?
【发布时间】:2019-05-31 11:31:02
【问题描述】:

问题

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

但真正的结果,是 Screen 2 GUI label text = '1'

如何根据 num 变量将 Screen 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)

【问题讨论】:

  • 示例代码请使用英文。不了解语言就很难理解代码。
  • 我编辑是为了方便理解问题和代码

标签: python kivy


【解决方案1】:

我相信你混淆了对象和类。一个类就像一个蓝图,而一个对象是由该蓝图创建的一个实例。

类本身通常不用于存储在程序运行期间更改的信息。

所以如果你取一个对象并修改它,它不会影响其他对象。如果你想重用它,你需要保护你修改的对象(或者使用一个非常糟糕的样式的全局变量,所以你不应该这样做!)。

例子:

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

【讨论】:

  • 我很抱歉,但我不明白“关于 def 更改”。 Def 只是 python 定义函数的方式。您可以将函数分配给变量(例如数字)。你能举一个很小的例子来说明你的工作吗?像 10-20 行一样长。
  • 对此我很抱歉,我是新来的...我将进行编辑以使其更具体。
【解决方案2】:

对于这种类型的任务,您不必使用静态变量,因为它不会通知更改,在您的情况下,var 仅在创建 Screen2 对象时采用 num 的值为 1,因此它永远不会更改到 2.

在 kivy 中,这些情况的解决方案是使用 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)

【讨论】:

  • 我可以在if 上使用数字属性来比较True if var == 2 else False 之类的东西吗?
  • @EnzoDtz 是:v = self.var == 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多