我正在尝试创建一个主菜单,让我在单击按钮时切换屏幕,但我无法弄清楚如何从按钮引用管理器。
我有一个主菜单页面的设置(在kv文件中):
<MainMenu>: #AnchorLayout
BoxLayout:
Button:
text: "button 1"
Button:
text: "change screen"
on_release: root.manager.current = "OtherPage"
<MainWidget>:
screen_manger: screen_manager
ScreenManger:
id: screen_manger
Screen:
name: "MainMenu"
MainMenu
Screen:
name: "OtherPage"
OtherPage #this is defined in the kv file, just lazy to type it.
当我点击按钮Change Screen
时,我得到:
AttributeError: 'MainMenu' object has no attribute 'manager'
一点都不诚实。我想我可以通过在python代码中编写所有布局并在BoxLayout
或MainMenu
窗口小部件中添加对屏幕管理器的引用来解决这个问题,但我不知道如何在kv中执行此操作文件。
答案 0 :(得分:3)
在更好地理解问题后重新做出答案:
您的MainWidget实例不知道screen_manager引用,它不会传递给它(并且在其规则root
中引用MainWidget实例,而不是ScreenManager
引用。
如果你将manager: screen_manager
置于MainWidget
实例的声明(第15行)之下,并且你将manager
ObjectProperty添加到MainWidget的python声明中,那么你的绑定将起作用。< / p>
蟒:
class MainWidget(Widget):
manager = ObjectProperty(None)
KV:
<MainWidget>:
screen_manger: screen_manager
ScreenManger:
id: screen_manger
Screen:
name: "MainMenu"
MainMenu:
manager: screen_manager
Screen:
name: "OtherPage"
然后它应该按你的意愿工作。
编辑:此外,这个由qui-non创建的wiki条目可能会有所帮助https://github.com/kivy/kivy/wiki/Linking-ScreenManager-to-a-different-Widget