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

Posted

技术标签:

【中文标题】在单独的 .kv (Kivy) 文件中定义的屏幕之间切换【英文标题】:Switching between screens defined in separate .kv (Kivy) files 【发布时间】:2018-12-30 07:58:15 【问题描述】:

我曾经设法通过在单个 .kv 文件中定义所有内容(包括屏幕)来使多屏幕程序正常工作。

通过使用root.current(在.kv 文件中)或self.root.current(在Python 文件中),我能够在屏幕之间切换。但是,一旦有多个带有许多小部件的屏幕,.kv 文件就会变得非常大并且难以维护。

这一次我尝试在单独的 .kv 文件中定义屏幕,但我无法在屏幕之间切换工作。到目前为止,每次尝试都会导致错误(语法无效,未定义屏幕名称......)。

是否有一种方法(或多种方法)在不同的 .kv 文件中定义的屏幕之间切换? 以下是我正在使用的文件:

ma​​in.py

from kivy.app import App


class MainApp(App):
    pass


if __name__ == '__main__':
    MainApp().run()

ma​​in.kv:

#:include screen_1.kv
#:include screen_2.kv

#:import NoTransition kivy.uix.screenmanager.NoTransition

ScreenManager:
    transition: NoTransition()


    Screen:
        name: "main_screen"

        BoxLayout:
            orientation: "vertical"

            Label:
                text: "main screen"
            Button:
                text: "to screen 1"
                on_press: app.root.current = "screen_1"
            Button:
                text: "to screen 2"
                on_press: app.root.current = "screen_2"

screen_1.kv:

Screen:
    name: 'screen_1'

    BoxLayout:
        orientation: "vertical"

        Label:
            text: "Screen 1"
        Button:
            text: "to main screen"
            on_press: app.root.current = "main_screen"
        Button:
            text: "to screen 2"
            on_press: app.root.current = "screen_2"

screen_2.kv:

Screen:
    name: 'screen_2'

    BoxLayout:
        orientation: "vertical"

        Label:
            text: "Screen 2"
        Button:
            text: "to main screen"
            on_press: app.root.current = "main_screen"
        Button:
            text: "to screen 1"
            on_press: app.root.current = "screen_1"

【问题讨论】:

【参考方案1】:

解决方案

    将dynamic class 添加到screen_1.kvscreen_2.kv,例如分别为<Screen1@Screen>:<Screen2@Screen>:。 在main.kv 中实例化屏幕Screen1:Screen2:

示例

screen_1.kv

<Screen1@Screen>:
    name: 'screen_1'

    BoxLayout:
        orientation: "vertical"

        Label:
            text: "Screen 1"
        Button:
            text: "to main screen"
            on_press: app.root.current = "main_screen"
        Button:
            text: "to screen 2"
            on_press: app.root.current = "screen_2"

screen_2.kv

<Screen2@Screen>:
    name: 'screen_2'

    BoxLayout:
        orientation: "vertical"

        Label:
            text: "Screen 2"
        Button:
            text: "to main screen"
            on_press: app.root.current = "main_screen"
        Button:
            text: "to screen 1"
            on_press: app.root.current = "screen_1"

main.kv

#:include screen_1.kv
#:include screen_2.kv

#:import NoTransition kivy.uix.screenmanager.NoTransition


ScreenManager:
    transition: NoTransition()


    Screen:
        name: "main_screen"

        BoxLayout:
            orientation: "vertical"

            Label:
                text: "main screen"
            Button:
                text: "to screen 1"
                on_press: app.root.current = "screen_1"
            Button:
                text: "to screen 2"
                on_press: app.root.current = "screen_2"

    Screen1:

    Screen2:

输出

【讨论】:

谢谢,这个解决方案有效。为了将来参考,您能否提示我解释该技术的资源/文档。所以我会理解它是如何工作的,并且下次能够自己找到解决类似问题的方法。谢谢。 不客气。更新了带有Kivy Dynamic Classes 链接的帖子。已注明。 我相信我已经这样做了,或者由于某种原因它看起来不是这样?

以上是关于在单独的 .kv (Kivy) 文件中定义的屏幕之间切换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 KivyMD 的 .kv 文件中使用 kivy 中的数据表?

在 kivy2 或 kivymd 中,有没有一种方法可以动态创建屏幕而不将它们添加到 kv 文件中

Kivy:使用 on_press 事件在屏幕管理器中更改屏幕

Kivy 使用两个文件 .kv

如何使用 kv 文件刷新 Kivy 中的 GridLayout

Kivy - Kv - ScreenManager - 改变当前屏幕