Python / Kivy - 在另一个调用函数的屏幕中替换标签的值

Posted

技术标签:

【中文标题】Python / Kivy - 在另一个调用函数的屏幕中替换标签的值【英文标题】:Python/Kivy - Replace value of a label in another screen calling a function 【发布时间】: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

提前感谢您的帮助。

【问题讨论】:

【参考方案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 '未定义。' 你能看一下我刚刚添加的例子吗? 好的,我明白了。现在我必须将它应用到我的应用程序中。谢谢!

以上是关于Python / Kivy - 在另一个调用函数的屏幕中替换标签的值的主要内容,如果未能解决你的问题,请参考以下文章

python - kivy:从另一个类调用函数

Python Kivy - 在另一个屏幕上显示动态结果

如何通过按下按钮 kivy/kivymd/python 在另一个窗口中创建按钮

Python/Kivy:如何在 ctrl+a 键盘事件上调用函数

使用 Kivy 的 Python 跨类函数调用

Python / Kivy - 在调用函数的另一个屏幕中替换标签的值