设置Kivy全局变量

4

我正在使用屏幕管理器来管理多个不同的屏幕。其中一个屏幕有两个按钮,它们都导航到另一个屏幕,但是根据按下的按钮不同,我希望标签在第二个屏幕上显示不同的文本。这是我的代码:

.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

在.kv文件中的ChooseProgScreen中,当按钮释放时,我调用.py文件中的一个方法来设置全局变量为新屏幕并打印它。当你按下其中一个按钮时,打印部分正常工作,并且全局变量以新字符串打印出来,但SwitchScreen标签仍然显示原来的内容。

"test"

而不是

"test1" or "test2"

我认为全局变量可能是做这件事情的一种可怕方式,但我不知道如何使用Screen管理器和kivy语言以其他方式完成它。如果有人能帮助正确使用全局变量,或者建议更好的方法来完成这个任务,那将不胜感激。
编辑:
问题在于屏幕仅在第一次加载时更新。我在SwitchScreen中添加了一个更新方法:
def update(self):
    self.ids.switchtitle.text = self.getTitle()

并在.kv文件中更新了SwitchScreen:

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

3

解决方案

  1. 在您的根部件类ScreenManagement()中定义一个类型为StringProperty的类属性MY_GLOBAL。
  2. 在kv文件中更新MY_GLOBAL。

示例

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

Output

Img01 - test1


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

这应该解决了你的问题。MY_GLOBAL 理论上可以通过 self.MY_GLOBAL 访问,但是你将它赋值给了方法下的一个新变量,而没有将其赋值给全局变量对象。


谢谢您的回答。我尝试了那个解决方案,但是我得到了相同的结果。更新后的字符串已经打印出来了,但它并没有显示为新标签。 - Peter Kapteyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接