Можно ли поместить весь код Kivy в пользовательскую функцию python, вызываемую из Main? - PullRequest
0 голосов
/ 08 апреля 2020

Я использую Kivy для интерфейса пользователя с управляющим приложением. Таким образом, пользовательский интерфейс является вспомогательным по отношению к основной функциональности. Для модульности / аккуратности я пытался поместить весь код Kivy в отдельный исходный файл и назвать его последним шагом в Main.

Однако, если я сделаю это, я обнаружу, что некоторые вещи не работают должным образом (например, создание меток программно и обновление их текста запланированными событиями).

Это то, что должно быть возможным? Есть ли какая-то хитрость, о которой я должен знать?

Если детали моего вопроса не ясны, я могу показать тестовый код для иллюстрации.

Monolithi c код, который работает, как и ожидалось:

cat test.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import StringProperty
from kivy.clock import Clock
import random

Builder.load_string('''
<YourWidget>:
    BoxLayout:
        id: Box1
        size: root.size
        Button:
            id: button1
            text: "Change text"
            on_release: root.change_text()
''')

class YourWidget(Screen):
    random_number = StringProperty()

    def __init__(self, **kwargs):
        super(YourWidget, self).__init__(**kwargs)
        label = Label(
                      id= 'label1',
                      text = self.random_number
                     )
        self.ids.Box1.add_widget(label)
        self.random_number = 'ini'
        Clock.schedule_interval(self.change_text,1)

    def change_text(self, *largs):
        self.random_number = str(random.randint(1, 100))


class updatetestapp(App):
    def build(self):

        sm = ScreenManager(transition=NoTransition())
        sm.add_widget(YourWidget(name='d_analogs'))

        return YourWidget()

if (True):
    updatetestapp().run()

Если я затем попытаюсь модулировать мой код, поместив всю обработку Kivy в пользовательскую функцию, все работает, кроме дисплея переменной числа выкупа. Переменная сохраняется через последовательные обратные вызовы, как показывают вызовы для печати, но она просто не отображается. Я предполагаю, что это как-то связано с областью действия или контекстом переменной - Kivy не отображает ту же переменную, которая обновляется в обратном вызове.

cat Main.py
#from mytest import mytest
import threading
import time

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import StringProperty
from kivy.clock import Clock

from display import *

def main():

    Display()

if __name__ == "__main__":
    main()
cat display.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.properties import StringProperty
from kivy.clock import Clock
import random

Builder.load_string('''
<YourWidget>:
    BoxLayout:
        id: Box1
        size: root.size
        Button:
            id: button1
            text: "Change text"
            on_release: root.change_text()
''')

class YourWidget(Screen):
    random_number = StringProperty()

    def __init__(self, **kwargs):
        super(YourWidget, self).__init__(**kwargs)
        label = Label(
                      id= 'label1',
                      text = self.random_number
                     )
        self.ids.Box1.add_widget(label)
        self.random_number = 'ini'
        Clock.schedule_interval(self.change_text,1)

    def change_text(self, *largs):
        self.random_number = str(random.randint(1, 100))


class test(App):
    def build(self):

        sm = ScreenManager(transition=NoTransition())
        sm.add_widget(YourWidget(name='d_analogs'))

        return YourWidget()

def Display():
    test().run()

1 Ответ

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

У вас нет кода, который изменил бы текст вашей метки. Хотя вы обновляете self.random_number, вы не обновляете текстовое свойство Label, поэтому не видите никаких изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...