【问题标题】:Python/Kivy - Replace value of a label in another screen calling a functionPython / Kivy - 在另一个调用函数的屏幕中替换标签的值
【发布时间】:2018-06-07 23:25:33
【问题描述】:

我有一个有 2 个屏幕的应用 (ScreenManager)。
我在第二个屏幕 (SettingsScreen) 中编写了一个函数,我希望该函数更新第一个屏幕中的标签。

以下两个类:

class MenuScreen(Screen):
    count = NumericProperty(30)

class SettingsScreen(Screen):
    def set_20(self):
        self.count = 20

这些类链接到 Kivy 样式表中的一个按钮和一个标签,具有两个不同的屏幕

<MenuScreen>:
    FloatLayout:
                orientation: 'horizontal'
                Label:
                    id: l_label
                    text: str(root.count)

<SettingsScreen>:
    BoxLayout: 
        orientation: 'vertical'
        padding: 50
        FloatLayout:
            Button:
                text: "20"
                on_release: root.set_20()

为了更清楚,用户必须点击SettingsScreen中的Button,将第一个屏幕中NumericProperty的值设置为20。

目前,如果我单击该按钮,则没有任何反应。

您在上面看到的是摘录 - 如果您想查看更多,应用程序的完整代码存储在下面。

https://github.com/marcogdepinto/LifeCounter

提前感谢您的帮助。

【问题讨论】:

    标签: python function label kivy


    【解决方案1】:

    我认为问题在于,当您的按钮被单击并调用 set_20 方法时,该方法试图将 SettingsScreen 的属性 count 设置为 20。

    换句话说

    def set_20(self):
            self.count = 20
    

    会尝试在SettingsScreen 中设置count 属性(因此是self),但找不到它。 MenuScreen 内还有另一个 count 属性,它对此一无所知。

    要解决这个问题,我认为你应该给 MenuScreen 一个 id

    <MenuScreen>:
       id: menu
    

    并且在Button的on_release方法中做

    on_release: menu.count = 20
    

    示例

    Python 文件

     class MenuScreen(Screen):
            counter = NumericProperty(0)
    
     class SettingsScreen(Screen):
            pass
    
     class MyWidget(ScreenManager):
            pass
    
    
     class MyRandomApp(App):
            def build(self):
                return MyWidget()
    
     if __name__ == '__main__':                                                                      
            MyRandomApp().run()
    

    kv文件

    <MyWidget>:
        id:manager
        MenuScreen:
            id: menu
            name: 'menuscreen'
            BoxLayout:
                orientation: 'vertical'
                Label:
                    text: str(menu.counter)
    
                Button:
                    text: 'Go to S2'
                    on_press: manager.current = 'settingsscreen'
        SettingsScreen:
            id: settings 
            name: 'settingsscreen'
            BoxLayout:
                orientation: 'vertical'
                Button:
                    text: 'Click to edit label of Prev screen'
                    on_press: menu.counter = 20
                Button:
                    text: 'Go to S1'
                    on_press: manager.current = 'menuscreen'
    

    【讨论】:

    • 我明白了。我只是查看了文档,假设 Kivy 属性像 python 类变量一样工作,我有点错误,因为它们是在类级别声明的。它们的工作方式与您使用 self 关键字声明的普通对象属性一样。
    • 你能不能尝试在 kv 文件中给 MenuScreen 一个 id: menu 并在 Button 中做 on_release: menu.count = 20
    • 在我将 kv 文件中的 'id: menu' 和 Button 中的 'on_release: menu.count = 20' 属性提供给 MenuScreen 后,我收到以下错误:'NameError: name 'menu '未定义。'
    • 你能看一下我刚刚添加的例子吗?
    • 好的,我明白了。现在我必须将它应用到我的应用程序中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2020-04-16
    相关资源
    最近更新 更多