如何在kivy python中的两个屏幕之间切换?

Posted

技术标签:

【中文标题】如何在kivy python中的两个屏幕之间切换?【英文标题】:how to switch between two screens in kivy python? 【发布时间】:2020-11-10 13:05:08 【问题描述】:

我正在尝试在两个屏幕之间切换.. 但它不起作用.. 它没有显示任何内容或任何错误我不知道是什么问题,这是我的代码

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen


class mainWindow(Screen):
    pass


class secondWindow(Screen):
    pass


class windowManager(ScreenManager):
    pass

sm = ScreenManager()
sm.add_widget(mainWindow(name='main'))
sm.add_widget(secondWindow(name='second'))


class multApp(App):
    def build(self):
        return mainWindow()


if __name__ == "__main__":
    multApp().run()

和 mult.kv

windowManager:
    mainWindow:
    secondWindow:

<mainWindow>:
    name: "main"

    Button:
        text: "Submit"
        on_press : root.manager.current = "second"

<secondWindow>:
    name: "second"

    Button:
        text: "go back"
        on_press : root.manager.current = "main"

【问题讨论】:

【参考方案1】:

您的代码中有几个问题。

您的build() 方法返回mainWindow()。这意味着您的应用程序 GUI 仅包含 Screen (mainwindow) 而没有 ScreenManager。因此,kv 中的 root.manager.current = 行将失败,因为没有经理。 您的 mult.kv 文件包含用于构建 GUI 的规则 (windowManager:),但该规则已被您的 build() 方法覆盖。 在您的代码中,您有三行(以sm = ScreenManager() 开头)也构建了 GUI,但您对这些行的结果不做任何事情。所以这些行没有效果。 您的类名应以大写字符开头。当你使用kv 时,这是一个要求。

考虑到所有这些,这里是您的代码的修改版本,应该可以工作:

python 代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen

class MainWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass

# sm = ScreenManager()
# sm.add_widget(mainWindow(name='main'))
# sm.add_widget(secondWindow(name='second'))


class multApp(App):
    pass
    # def build(self):
    #     return mainWindow()


if __name__ == "__main__":
    multApp().run()

mult.kv:

WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"

    Button:
        text: "Submit"
        on_press : root.manager.current = "second"

<SecondWindow>:
    name: "second"

    Button:
        text: "go back"
        on_press : root.manager.current = "main"

【讨论】:

【参考方案2】:

我同意约翰的回答,只是补充一下。如果你将 manager 声明为一个类,我总是在构建方法中返回 manager,这也是在你的 root manager 下为你的屏幕创建 id 的好习惯,这样会让它们更容易引用

<WindowManager>:
    id: screen_manager

    MainWindow:

         id: main_window
         name: "main_window"
         manager: screen_manager   

    SecondWindow:

         id: second_window
         name: "second_window"
         manager: screen_manager 

【讨论】:

以上是关于如何在kivy python中的两个屏幕之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

在单独的 .kv (Kivy) 文件中定义的屏幕之间切换

如何使用 python 代码在 Kivy 中切换屏幕

Python Kivy 在 Popup 内的按钮之间切换

python- .py 文件中的 Kivy 屏幕管理器

从 python 代码而不是 KV 在屏幕之间切换

为啥切换屏幕在 kivy 中不起作用?