在没有屏幕管理器 Class 的情况下更改 Python 中的屏幕

Changing screens in Python without Screen Manager Class

我在我的所有屏幕上都使用手势,我不能使用屏幕管理器 class 来管理我的屏幕,我相信是这样。我可以使用 manger.current = 'some_screeen' 导航 .kv 文件,但不能在 .py 文件中导航。

我一直在 .py 文件中尝试 Runner().ids.manager.current = 'some_screen' 但它不起作用。甚至没有抛出错误。画面完全没有变化

基本代码(为简洁起见):

class Runner(gesture.GestureBox):
    pass

MyApp(App):
    def build(self):
        return Runner()

然后在 KV 文件中,我正在创建屏幕管理器。

<Runner>:
    ScreenManager:
        id: manager

        Screen:
            name: 'main_screen'
            Button:
                on_press:
                    manager.current = 'screen1'
        Screen:
            name: 'screen1'
            Button:
                on_press:
                    manager.current = 'home_screen'

I've been trying Runner().ids.manager.current = 'some_screen' in the .py file but it doesn't work. There isn't even an error thrown. The screen doesn't change at all.

它工作正常,只是没有按照您的想法行事。当您编写 Runner() 时,您会得到 Runner class 的 new 实例,它有自己的 children,包括自己的 ScreenManager。这与您在 gui 中显示的那个无关。当您设置它的 current 属性 时,ScreenManager 会尽职尽责地改变屏幕,只是您无法看到它。

您真正想要的是更改您在 gui 中显示的小部件的 current 属性。执行此操作的最佳方法取决于您忽略的上下文(始终尝试提供完整的可运行示例,不清楚您的失败代码是什么样的)。但是,在这种情况下,Runner 实例是您的根小部件,可以使用 App.get_running_app().root 访问,因此您可以编写 App.get_running_app().root.ids.manager.current = 'some_screen'。同样,根据您构建代码的方式,可能会有更简洁的方法,但这始终是一种选择。