Установка глобальных переменных Kivy - PullRequest
0 голосов
/ 02 июля 2018

Я использую Screen Manager для управления несколькими разными экранами. На одном экране есть две кнопки, которые ведут на другой экран, но в зависимости от того, какая кнопка была нажата, я бы хотел, чтобы метка отображала другой текст на втором экране. Вот мой код:

.py

MY_GLOBAL = "test"

class ChooseProgScreen(Screen):
    global MY_GLOBAL
    def setTitle(self, newTitle):
        MY_GLOBAL = newTitle
        print(MY_GLOBAL)

class SwitchScreen(Screen):
    global MY_GLOBAL
    def getTitle(self):
        return MY_GLOBAL

class ScreenManagement(ScreenManager):
    pass

class MainApp(App):
    def build(self):
        presentation = Builder.load_file("kivy.kv")
        return presentation

.kv

ScreenManagement:
    transition: FadeTransition()
    HomeScreen:
    ChooseProgScreen:
    SwitchScreen:
    NewProgScreen:

<ChooseProgScreen>:
    name: "chooseprog"
    FloatLayout:
        Button:
            text: "test1"
            on_release: 
                root.setTitle("test1")
                app.root.current = "switch"
            color: 1,1,1,1
            font_size: 25
            size_hint: 0.15,0.15
            pos_hint: {"center_x":.1, "center_y":.9}
        Button:
            text: "test2"
            on_release:
                root.setTitle("test2")
                app.root.current = "switch"
            color: 1,1,1,1
            font_size: 25
            size_hint: 0.15,0.15
            pos_hint: {"center_x":.3, "center_y":.9}

<SwitchScreen>:
    name: "switch"
    FloatLayout:
        Label:
            text: root.getTitle()
            pos_hint: {"center_x":.1, "center_y":.1}
            font_size: 25

В ChooseProgScreen в .kv, когда кнопка отпущена, я вызываю метод из файла .py, который устанавливает глобальную переменную на новый экран и печатает ее. Когда вы нажимаете одну из кнопок, часть печати работает нормально, и глобальная переменная печатается как новая строка, но на этикетке SwitchScreen по-прежнему отображается

"test"

а не

"test1" or "test2"

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

EDIT

Проблема заключалась в том, что экран обновлялся только при первой загрузке. Я добавил метод обновления для SwitchScreen:

def update(self):
    self.ids.switchtitle.text = self.getTitle()

и обновил SwitchScreen в файле .kv:

<SwitchScreen>:
    on_enter:
        root.update()
    Label:
        id: switchtitle
        text: root.getTitle()
        pos_hint: {"center_x":.1, "center_y":.1}
        font_size: 25

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Решение

  1. Определите атрибут класса MY_GLOBAL типа StringProperty в вашем корневом виджете, класс ScreenManagement ().
  2. Обновить MY_GLOBAL в файле kv.

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import StringProperty


class ChooseProgScreen(Screen):
    pass


class SwitchScreen(Screen):
    pass


class ScreenManagement(ScreenManager):
    MY_GLOBAL = StringProperty('test')


class MainApp(App):

    def build(self):
        return Builder.load_file("kivy.kv")


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

kivy.kv

#:kivy 1.10.0
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    ChooseProgScreen:
    SwitchScreen:

<ChooseProgScreen>:
    name: "chooseprog"
    FloatLayout:
        Button:
            text: "test1"
            on_release:
                root.manager.MY_GLOBAL = self.text
                root.manager.current = "switch"
            color: 1,1,1,1
            font_size: 25
            size_hint: 0.15,0.15
            pos_hint: {"center_x":.1, "center_y":.9}
        Button:
            text: "test2"
            on_release:
                root.manager.MY_GLOBAL = self.text
                root.manager.current = "switch"
            color: 1,1,1,1
            font_size: 25
            size_hint: 0.15,0.15
            pos_hint: {"center_x":.3, "center_y":.9}

<SwitchScreen>:
    name: "switch"
    FloatLayout:
        Label:
            text: root.manager.MY_GLOBAL
            pos_hint: {"center_x":.1, "center_y":.1}
            font_size: 25

выход

Img01 - test1

0 голосов
/ 02 июля 2018
class ChooseProgScreen(Screen):
    def setTitle(self, newTitle):
        global MY_GLOBAL
        MY_GLOBAL = newTitle
        print(MY_GLOBAL)

Это должно решить вашу проблему. MY_GLOBAL технически будет доступен через self.MY_GLOBAL, вместо этого вы присваиваете его новой переменной в методе, но не назначаете его объекту глобальной переменной.

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