Как ссылаться на атрибуты класса Kivy App - PullRequest
0 голосов
/ 07 апреля 2020

Я застрял в проблеме ссылки на реальную переменную класса приложения, я новичок в kivy

вижу этот код

class Screen_mgr(ScreenManager):
    pass

class MainScreen(Screen):
    def func(self):
        if(SimpleApp.num == 0): #this statement always returns True as num is always 0 in app class
            SimpleApp.num +=10 #How can I access the num variable of app class

class SimpleApp(MDApp):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.theme_cls.theme_style = "Dark"

    num = NumericProperty(0)
    def build(self):
        return Screen_mgr()

if __name__ == "__main__":
    SimpleApp().run()

Я хочу использовать эту переменную num везде только в коде python Не в коде KV.

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вы можете определить его вне вашего класса, что сделает его глобальной переменной, поэтому вы можете использовать его везде в вашем .py файле или .kv файле

0 голосов
/ 07 апреля 2020

Я думаю, что ваш код (по крайней мере, то, что вы опубликовали) должен работать так, как вы ожидаете. Вот версия вашего кода, с дополнительным кодом, чтобы он работал. Button вызывает func каждый раз, когда вы нажимаете его, и показывает ожидаемое поведение (с num как NumericProperty):

from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.app import MDApp


class Screen_mgr(ScreenManager):
    pass


class MainScreen(Screen):
    def func(self):
        app = MDApp.get_running_app()
        print(app.num)
        if(app.num == 0): #this statement always returns True as num is always 0 in app class
            app.num +=10 #How can I access the num variable of app class


Builder.load_string('''
<Screen_mgr>:
    MainScreen:
        id: main
        name: 'main'
        Button:
            text: 'doit'
            on_release: main.func()
''')


class SimpleApp(MDApp):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.theme_cls.theme_style = "Dark"

    num = NumericProperty(0)

    def build(self):
        return Screen_mgr()


if __name__ == "__main__":
    SimpleApp().run()
...