Kivy screenmanager 当前屏幕没有切换(至少在视觉上没有)。使用 kivymd

Kivy screenmanager current screen not switching (at least not visually). Using kivymd

我正在使用 python、kivymd 和 kivy 的屏幕管理器切换登录系统,但是,当我尝试将屏幕从登录屏幕切换到另一个屏幕时,没有任何反应,没有错误,并且没有视觉变化。这是一个可重现的例子:

.py 文件

import kivy
from kivy.uix.image import Image
from kivy.uix.screenmanager import ScreenManager, Screen

from kivy.lang import Builder
from kivymd.app import MDApp

class Screen1(Screen):
    def SwitchScreen(self):
        scrMng.current = "screen2"

class Screen2(Screen):
    def SwitchScreen(self):
        scrMng.current = "screen1"

scrMng = ScreenManager()
scrMng.add_widget(Screen1(name = "screen1"))
scrMng.add_widget(Screen2(name = "screen2"))

class TestApp(MDApp):
        def build(self):
            return Builder.load_file("main.kv")


TestApp().run()

.kv 文件

ScreenManager:
    Screen1:
    Screen2:

<Screen1>
    name: "screen1"
    
    MDCard:
        size_hint: None, None
        size: 300, 350
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 25
        spacing: 25
        orientation: 'vertical'

        MDLabel:
            text: "Screen2"
            font_size: 40
            halign: "center"
            font_bold: True
            theme_text_color: "Custom"
            text_color: (0.20, 0.33, 1.00, 1)

        MDRoundFlatButton:
            text: "SWITCH"
            font_size: 12
            pos_hint: {"center_x": 0.5}
            on_press: self.parent.parent.SwitchScreen()

<Screen2>
    name: "screen2"
    
    MDCard:
        size_hint: None, None
        size: 300, 350
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 25
        spacing: 25
        orientation: 'vertical'

        MDLabel:
            text: "Screen1"
            font_size: 40
            halign: "center"
            font_bold: True
            theme_text_color: "Custom"
            text_color: (0.20, 0.33, 1.00, 1)

        MDRoundFlatButton:
            text: "SWITCH"
            font_size: 12
            pos_hint: {"center_x": 0.5}
            on_press: self.parent.parent.SwitchScreen()

Python版本:3.9.9 基维版本:2.0.0

感谢任何帮助!

您正在使用以下行创建 GUI:

scrMng = ScreenManager()
scrMng.add_widget(Screen1(name = "screen1"))
scrMng.add_widget(Screen2(name = "screen2"))

但是上面创建的scrMng从来没有用过,所以那些行可以去掉。 python 代码中对 scrMng 的引用不会执行任何操作,因为 scrMng 实际上不是您应用程序的一部分。

您的 GUI 实际上是由以下行创建的:

return Builder.load_file("main.kv")

那么Screen classes可以变成:

class Screen1(Screen):
    def SwitchScreen(self):
        self.manager.current = "screen2"

class Screen2(Screen):
    def SwitchScreen(self):
        self.manager.current = "screen1"

请注意 Screen class 中的 self.manager 始终是对其 ScreenManager 的引用。