Как получить доступ к переменной из другого класса внутри def с KIVY? - PullRequest
0 голосов
/ 05 января 2019

Задача

Я использую kivy и ScreenManager для создания графического интерфейса и использования множества экранов.

У меня есть класс Screen1 и одна переменная внутри него, названная num, значение которой равно 1.

В графическом интерфейсе Screen1 есть кнопка, и когда я нажимаю кнопку, он вызывает def calledwithbutton, который изменяет переменную num на self.num = 2, а затем изменяет экран на Экран 2.

Класс Screen2 имеет переменную var, значение которой равно Screen1().num.

Графический интерфейс Screen2 имеет метку, текст str(var)

Ожидаемый результат: текст метки графического интерфейса Screen2 = '2'

Но реальный результат заключается в том, что текст метки графического интерфейса экрана 2 = '1'

Как изменить текст метки графического интерфейса экрана 2 на '2' на основе переменной 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 голосов
/ 05 января 2019

Для задач этого типа вам не нужно использовать статические переменные, так как эта не уведомляет об изменении, в вашем случае var принимает значение num, равное 1, когда создается объект Screen2, поэтому он никогда не изменится. до 2.

В киви решением для этих случаев является использование свойств , в данном случае 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()

*. Киловольт

<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)
0 голосов
/ 05 января 2019

Я полагаю, вы путаете объекты и классы. Класс похож на проект, а объект - это один экземпляр, созданный из этого проекта.

Сами классы обычно не используются для хранения информации, которая изменяется во время выполнения программы.

Таким образом, если вы возьмете объект и измените его, это не повлияет на другие объекты. Вам нужно сохранить объект, который вы изменили, если вы хотите использовать его повторно (или использовать глобальную переменную, которая очень плохого стиля, поэтому вы не должны этого делать!).

Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...