使用 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 格式下载刀片页面?

如何让组件在单击按钮时以角度删除自身

如果在主页按钮位于右侧时以横向模式初始化,iOS MKMapView 将显示空白地图

如何在按钮单击时以文本格式保存列表视图的所有数据

Vue3在按钮单击时以编程方式创建组件实例

KivyMD - ScreenManager 和 ids