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

Posted

技术标签:

【中文标题】在没有屏幕管理器类的情况下在 Python 中更改屏幕【英文标题】:Changing screens in Python without Screen Manager Class 【发布时间】:2019-04-02 20:16:22 【问题描述】:

我在所有屏幕上都使用了手势,我不能使用屏幕管理器类来管理我的屏幕,至少我相信。我可以使用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'

【问题讨论】:

你有什么错误吗?或者预期的行为与您正在经历什么?我读到这里有点困惑。我知道您正在使用 Kivy,并且您的 .py 文件中缺少很多处理。但究竟是什么? @Torxed,感谢您尝试回答我的问题! Inclement 现场回答了我的问题。很抱歉我没有包含更多代码。正如我认为的那样,其中大部分都是多余的。 【参考方案1】:

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

它工作正常,只是没有按照你的想法去做。当您编写Runner() 时,您会得到一个Runner 类的 实例,它有自己的子项,包括它自己的ScreenManager。这与您在 gui 中显示的无关。当您设置其current 属性时,ScreenManager 将尽职尽责地更改屏幕,只是您无法看到。

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

【讨论】:

是的!这正是我想要完成的。太感谢了。该代码对我来说很有意义并且很整洁,因为我有时会使用类似的命令字符串。但我从来没有使用过get_running_app().root,所以这对于添加到我的 Kivy 编码库中会非常有帮助!

以上是关于在没有屏幕管理器类的情况下在 Python 中更改屏幕的主要内容,如果未能解决你的问题,请参考以下文章

如何在python脚本中默认情况下在第二个TFT屏幕上运行套接字服务器控制台,而不是在主TFT屏幕上?

如何在没有浏览器的情况下在 python 中使用 Tor?

如何在没有来自脚本的 Internet 连接的情况下在 Python 中转发地理编码?

执行堆栈操作以在没有集合api的情况下在java中推送字符串

如何在没有控件的情况下在 android 中制作相机应用程序,以便仅在屏幕上显示来自镜头的视图? [关闭]

如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?