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
的引用。
我正在使用 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
的引用。