【问题标题】:Switching between screens defined in separate .kv (Kivy) files在单独的 .kv (Kivy) 文件中定义的屏幕之间切换
【发布时间】: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"

【问题讨论】:

    标签: python kivy screen


    【解决方案1】:

    解决方案

    1. dynamic class 添加到screen_1.kvscreen_2.kv,例如分别为<Screen1@Screen>:<Screen2@Screen>:
    2. 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 链接的帖子。已注明。
    • 我相信我已经这样做了,或者由于某种原因它看起来不是这样?
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多