首页 > 解决方案 > Kivy 动态类 - 第二个屏幕未链接

问题描述

我正在尝试使用动态类技术来更好地格式化我的代码,而不是将所有内容都放在一个.kv文件中。我查看了这个答案,并尝试尽可能地将其复制到我所拥有的内容中,但遇到了一个问题。

该代码有效,但在正确输入密码后不会转换到“选择”屏幕。相反,输入文本被清除(应该如此),但不会转换。几乎就像“选择”屏幕没有正确链接一样。我不确定我哪里出错了。有人可以为我提供一些帮助吗?

主文件

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout


def invalid_login():
    app = App.get_running_app()
    app.root.current = "Main"
    # Create a BoxLayout to add multiple lines or buttons to a PopUp
    box = BoxLayout()
    # Create PopUp
    pop = Popup(
        title="Invalid Password",
        size_hint=(None, None), size=(200, 100),
        content=box,
        auto_dismiss=False
    )
    # Dismiss PopUp
    box.add_widget(Button(text="Close", on_release=pop.dismiss))
    pop.open()


class MainWindow(Screen):
    def login(self):
        if self.ids.password.text == "Password":
            # Clear TextInput
            self.ids.password.text = ""
            # Go to the next page
            app = App.get_running_app()
            app.root.current = "Select"
        else:
            self.ids.password.text = ""
            invalid_login()


class SelectWindow(Screen):
    pass


class TrainingWindow(Screen):
    pass


class ModelWindow(Screen):
    pass


class TrainModelWindow(Screen):
    pass


class ParametersWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


kv_main = Builder.load_file('main.kv')
kv_select = Builder.load_file('select.kv')
kv_training = Builder.load_file('training.kv')
kv_model = Builder.load_file('model.kv')
kv_train_model = Builder.load_file('train_model.kv')
kv_parameters = Builder.load_file('parameters.kv')

class MyApp(App):
    def build(self):
        return kv_main


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

主文件

#:import utils kivy.utils
#:include main.kv
#:include select.kv
#:include training.kv
#:include model.kv
#:include train_model.kv
#:include parameters.kv

MainWindow:
    name: "Main"

    GridLayout:
        cols: 1

        BoxLayout:
            orientation: "vertical"
            canvas.before:
                Color:
                    rgba: 0,0,0,1
                Rectangle:
                    pos: self.pos
                    size: self.size
            Label:
                size_hint: 1, 1
                text: "App"
                font_size: 50
                color:
                    utils.get_color_from_hex('#FF0000')
            Label:
                size_hint: 1, 1
                text: "This App Does...."
                font_size: 40

        BoxLayout:
            size_hint: 1, 0.005
            canvas.before:
                Color:
                    rgba: (1,1,1,1)
                Rectangle:
                    size: self.size
                    pos: self.pos

        BoxLayout:
            orientation: "horizontal"
            size_hint: (0.35, 0.35)
            padding: (0,0,25,0)

            Label:
                font_size: 20
                text: "Password"
                size_hint: (0.5, 0.35)
                pos_hint: {'x': 1, 'y': 0.4}
                background_color: (0,0,0,1)
                canvas.before:
                    Color:
                        rgba: self.background_color
                    Rectangle:
                        size: self.size
                        pos: self.pos


            TextInput:
                id: password
                multiline: False
                size_hint: (0.5, 0.35)
                pos_hint: {'x': 1, 'y': 0.4}
                focus: True
                background_color:
                    utils.get_color_from_hex('#18B8D9')
                cursor_color: (0,0,0,1)
                password: True


        Button:
            text: "Submit"
            on_release: root.login()

选择.kv

<SelectWindow@Screen>:
    name: "Select"

    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Go Back"
            on_release:
                app.root.current = "Main"
                root.manager.transition.direction = "right"

标签: pythonkivy

解决方案


正如@inclement 评论的那样,我试图将屏幕用作我的屏幕管理器。我将我main.kv的更新为以下内容,一切都解决了。

WindowManager:
    MainWindow:
    SelectWindow:
    TrainingWindow:
    ModelWindow:
    TrainModelWindow:
    ParametersWindow:

<MainWindow>
    name: "Main"

推荐阅读