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

问题描述 投票:1回答:1

我有一个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()

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

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

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

https://github.com/marcogdepinto/LifeCounter

在此先感谢您的帮助。

python function label kivy
1个回答
2
投票

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

def set_20(self):
        self.count = 20

会尝试在SettingsScreen内设置count属性(因此单词self)并且找不到它。在count内还有另一个MenuScreen财产,它对此一无所知。 为了解决这个问题,我认为你应该给MenuScreen一个id

<MenuScreen>:
   id: menu

并在Button的on_release方法中

on_release: menu.count = 20

EXAMPLE

他妈的哥们

 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 file

<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'

enter image description here

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.