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 - 在另一个调用函数的屏幕中替换标签的值的主要内容,如果未能解决你的问题,请参考以下文章
如何通过按下按钮 kivy/kivymd/python 在另一个窗口中创建按钮