【问题标题】:How to update label text when switching to another screen in kivy python在kivy python中切换到另一个屏幕时如何更新标签文本
【发布时间】:2021-02-28 16:05:34
【问题描述】:

您好,我对 kivy python 编程非常陌生。我已经为这个问题头疼了 3 天。如果有人可以帮助我,我将不胜感激。

基本上我有一个名为“SCORE”的变量。在第一个屏幕上,我有 2 个按钮。一个名为“更新”的按钮将 SCORE 的值增加 5,第二个名为“下一步”的按钮将我的应用程序切换到下一个屏幕。

我的问题:切换到第二个屏幕后,有一个标签,我想在转换到此屏幕后立即显示变量 SCORE 的当前值。我无法做到这一点,我唯一能做的就是在点击更新按钮后进行评分更新,但我想在点击更新按钮之前正确显示它。 我应该在我的类 Screen2 中为参数 score = '' 而不是空字符串输入我的 python 代码以正确加载上一个屏幕的值?

我尝试了全局变量,objectProperties 似乎没有解决我的问题。 感谢您的任何回答或帮助。

python 代码:

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

Builder.load_file('design.kv')


class Screen1(Screen):
    app = App.get_running_app()

    def update_score(self):
        app = App.get_running_app()
        app.SCORE += 5
        self.ids.score.text = 'Score: ' + str(app.SCORE)

    def next(self):
        self.manager.current = 'screen2'


class Screen2(Screen):
    score = ''

    def update_score(self):
        app = App.get_running_app()
        app.SCORE += 5
        self.ids.score.text = 'Score: ' + str(app.SCORE)

    def next(self):
        self.manager.current = 'screen2'


class RootWidget(ScreenManager):
    pass


class MyApp(App):
    SCORE = 0

    def build(self):
        return RootWidget()


if __name__ == '__main__':
    MyApp().run()

kivy 文件:

<Screen1>:
    GridLayout:
        cols:1
        width: root.width
        height: root.height
        padding: 20
        spacing: 10
        GridLayout:
            cols:1
            Label:
                id: score
                text: 'Score: 0'
            GridLayout:
                cols:2
                Button:
                    text: 'Update'
                    on_release: root.update_score()
                Button:
                    text: 'Next'
                    on_release: root.next()

<Screen2>:
    GridLayout:
        cols:1
        width: root.width
        height: root.height
        padding: 20
        spacing: 10
        GridLayout:
            cols:1
            Label:
                id:score
                text: f'Level: {root.score}'
            GridLayout:
                cols:2
                Button:
                    text: 'Update'
                    on_release: root.update_score()
                Button:
                    text: 'Next'
                    on_release: root.next()

<RootWidget>:
    Screen1:
        id: screen1
        name: 'screen1'
    Screen2:
        id: screen2
        name: 'screen2'

【问题讨论】:

    标签: python-3.x kivy


    【解决方案1】:

    您可以通过将SCORE 定义为AppNumericProperty 并在您的kv 中引用该属性来完成此操作。 在您的MyApp 中,将SCORE 定义为:

    class MyApp(App):
        SCORE = NumericProperty(0)
    

    在您的kv 中,您可以在Screens 中引用它:

    text: 'Score: ' + str(app.SCORE)
    

    和:

    text: 'Level: ' + str(app.SCORE)
    

    通过自动更新,您不再需要自己更新Label文本,因此update_score()方法(在Screens中)只需要更新SCORE本身:

    def update_score(self):
        app = App.get_running_app()
        app.SCORE += 5
        # self.ids.score.text = 'Score: ' + str(app.SCORE)
    

    事实上,由于update_score() 的那些方法是相同的,你可以只在App 中使用一个update_score() 方法,而不是在Screens 中。

    请注意,只要 kivy 能够识别对 SCORE 属性的简单依赖,kivy 就会自动更新这两个 Labels。的使用

    text: f'Level: {root.score}'
    

    对 kivy 隐藏该依赖关系,因此不会发生自动更新。

    这是使用上述建议的代码修改版本:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.properties import NumericProperty
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    
    Builder.load_file('design.kv')
    
    class Screen1(Screen):
    
        def next(self):
            self.manager.current = 'screen2'
    
    
    class Screen2(Screen):
    
        def next(self):
            self.manager.current = 'screen2'
    
    
    class RootWidget(ScreenManager):
        pass
    
    
    class MyApp(App):
        SCORE = NumericProperty(0)
    
        def build(self):
            return RootWidget()
    
        def update_score(self):
            self.SCORE += 5
    
    
    if __name__ == '__main__':
        MyApp().run()
    

    还有design.kv 文件:

    <Screen1>:
        GridLayout:
            cols:1
            width: root.width
            height: root.height
            padding: 20
            spacing: 10
            GridLayout:
                cols:1
                Label:
                    id: score
                    text: 'Score: ' + str(app.SCORE)
                GridLayout:
                    cols:2
                    Button:
                        text: 'Update'
                        on_release: app.update_score()
                    Button:
                        text: 'Next'
                        on_release: root.next()
    
    <Screen2>:
        GridLayout:
            cols:1
            width: root.width
            height: root.height
            padding: 20
            spacing: 10
            GridLayout:
                cols:1
                Label:
                    id:score
                    text: 'Level: ' + str(app.SCORE)
                GridLayout:
                    cols:2
                    Button:
                        text: 'Update'
                        on_release: app.update_score()
                    Button:
                        text: 'Next'
                        on_release: root.next()
    
    <RootWidget>:
        Screen1:
            id: screen1
            name: 'screen1'
        Screen2:
            id: screen2
            name: 'screen2'
    

    【讨论】:

    • 哇,非常感谢您,先生。你又为我节省了 3 天的时间。也感谢您对代码改进的详细解释和提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多