使用 ScreenManager 在按钮释放时以 kv 初始化屏幕
Posted
技术标签:
【中文标题】使用 ScreenManager 在按钮释放时以 kv 初始化屏幕【英文标题】:Init screen in kv on button release using ScreenManager 【发布时间】:2016-09-06 23:22:03 【问题描述】:我是 Kivy 开发新手,我需要你们的一些建议。 我正在使用 ScreenManager 在屏幕之间跳转,据我所知,所有屏幕都是在应用程序启动后初始化的,我需要使用以前屏幕的某些属性对它们进行初始化,例如选择类别或内容。有没有办法做到这一点?
我在 CategorySelectScreen 中有两个按钮都代表某个类别,我希望它们向 DictScreen 发送一个字符串属性,它将用作 CategorySelect 方法中的参数,该方法过滤项目列表,但问题是,应用程序在开始时需要该参数,如果没有它,解释器只会抛出错误。
另外,我认为我使用 kivy 的方式非常糟糕,请您查看我的代码并给我一些专业提示吗?在此先感谢,干杯:)
kv 文件:http://pastebin.com/UdvGS7Wv
py 文件:http://pastebin.com/gJn9Mrip
【问题讨论】:
提供minimal verifable example而不是粘贴几百行代码,拆分成多个文件。 【参考方案1】:当你声明你的屏幕时,决定它的输入对象是什么。然后将此对象设为属性。之后,设置 on_... 回调,您可以在其中使用基于此输入对象的值的小部件构建屏幕。例如:
class DictScreen(Screen):
category_selected = ObjectProperty(None)
def on_category_selected(self, instance, value):
category_selected = value
self.clear_widgets()
self.add_widget(Button(text=category_selected.name))
在上一个屏幕中,在您切换到 DictScreen 之前,从 app.root.ids 获取其实例,然后将 category_selected 分配给它,然后使用 ScreenManager 设置新的当前屏幕。这样,您的 DictScreen 将在您切换到它之前立即使用所选类别构建。
“在切换到 DictScreen 之前获取它的实例”如何做到这一点?这里解释得很好: https://kivy.org/docs/api-kivy.uix.widget.html?highlight=widget#kivy.uix.widget.Widget.ids
【讨论】:
我能以某种方式在 .py 中获取在 kv 文件中创建的小部件的实例吗?或者我应该在 on_category_selected 方法中构建整个屏幕表单吗?我已经在 kv 中设置了整个屏幕的布局,我想保存它,只是以某种方式更新它。 我已经更新了我的答案。每个小部件都有“ids”属性,它是一个 DictProperty。查看我在回答中提供的链接。以上是关于使用 ScreenManager 在按钮释放时以 kv 初始化屏幕的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 java 脚本单击按钮时以 PDF 格式下载刀片页面?