Kivy screenmanager当前屏幕没有切换(至少在视觉上没有).使用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.9Kivy版本: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类可以变成:

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

注意,Screen类中的self.manager总是对其ScreenManager的引用。

最新更新