为什么切换屏幕在 kivy 中不起作用?
Why is switching screens not working in kivy?
我正在尝试在 kivy 中切换屏幕,但我已经在这个问题上停留了一段时间,所以我不知道发生了什么。
正在打印文本,但屏幕仍然没有变化。
如果有人可以帮助我,这里是 python 代码:
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import MDList
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivymd.uix.button import MDFloatingBottomButton
Window.size = (300, 500)
class MainScreen(Screen):
def switch_button(self):
print("switching")
ScreenManager.current = "FileScreen"
class FileScreen(Screen):
pass
class app(MDApp):
data = {
'Create': 'file-document',
'Open': 'folder-open'
}
def btn(self, instance):
print('callback')
icon = instance.icon
# if you want check button, use
if isinstance(instance, MDFloatingBottomButton):
if icon == 'file-document':
print('Create')
MainScreen.switch_button(self)
elif icon == 'folder-open':
print('Open')
class ContentNavigationDrawer(BoxLayout):
pass
class DrawerList(ThemableBehavior, MDList):
pass
sm = ScreenManager()
sm.add_widget(MainScreen(name='MainScreen'))
sm.add_widget(FileScreen(name='FileScreen'))
def build(self):
self.theme_cls.primary_palette = "Red"
#self.theme_cls.accent_palette = "Teal"
screen = Builder.load_file("main.kv")
return screen
app().run()
这里是 .KV
代码:
ScreenManager:
MainScreen:
FileScreen:
<MainScreen>:
name: "MainScreen"
MDFloatingActionButtonSpeedDial:
bg_hint_color: app.theme_cls.primary_light
data: app.data
root_button_anim: True
callback: app.btn
<FileScreen>:
name: "FileScreen"
MDBoxLayout:
MDLabel:
text: "test"
我希望社区能尽快帮助我,因为如果我已经坚持了一段时间。
您似乎混淆了 classes 和 instances。在您的 switch_button()
方法中,您的代码:
ScreenManager.current = "FileScreen"
正在设置 ScreenManager
class 的 current
属性,但是 current
属性 是一个实例 属性 并且必须在 ScreenManager
的实例上设置。它必须是管理 FileScreen
Screen
.
的实例
switch_button()
方法的更好编码:
class MainScreen(Screen):
def switch_button(self):
print("switching")
self.manager.current = "FileScreen"
self.manager
是对管理 MainScreen
的 ScreenManager
的引用,MainScreen
也管理 FileScreen
。
在其他地方,您在 class 和实例之间进行了类似的混淆:
MainScreen.switch_button(self)
同样,您需要 MainScreen
的实例,而不是 MainScreen
class 的实例。此行可以替换为:
self.root.get_screen('MainScreen').switch_button()
此代码使用ScreenManager
的get_screen()
方法访问MainScreen
的实例,然后调用switch_button()
.
的实例方法
更直接的方法是将该行替换为:
self.root.current = 'FileScreen'
我正在尝试在 kivy 中切换屏幕,但我已经在这个问题上停留了一段时间,所以我不知道发生了什么。 正在打印文本,但屏幕仍然没有变化。 如果有人可以帮助我,这里是 python 代码:
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import MDList
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivymd.uix.button import MDFloatingBottomButton
Window.size = (300, 500)
class MainScreen(Screen):
def switch_button(self):
print("switching")
ScreenManager.current = "FileScreen"
class FileScreen(Screen):
pass
class app(MDApp):
data = {
'Create': 'file-document',
'Open': 'folder-open'
}
def btn(self, instance):
print('callback')
icon = instance.icon
# if you want check button, use
if isinstance(instance, MDFloatingBottomButton):
if icon == 'file-document':
print('Create')
MainScreen.switch_button(self)
elif icon == 'folder-open':
print('Open')
class ContentNavigationDrawer(BoxLayout):
pass
class DrawerList(ThemableBehavior, MDList):
pass
sm = ScreenManager()
sm.add_widget(MainScreen(name='MainScreen'))
sm.add_widget(FileScreen(name='FileScreen'))
def build(self):
self.theme_cls.primary_palette = "Red"
#self.theme_cls.accent_palette = "Teal"
screen = Builder.load_file("main.kv")
return screen
app().run()
这里是 .KV
代码:
ScreenManager:
MainScreen:
FileScreen:
<MainScreen>:
name: "MainScreen"
MDFloatingActionButtonSpeedDial:
bg_hint_color: app.theme_cls.primary_light
data: app.data
root_button_anim: True
callback: app.btn
<FileScreen>:
name: "FileScreen"
MDBoxLayout:
MDLabel:
text: "test"
我希望社区能尽快帮助我,因为如果我已经坚持了一段时间。
您似乎混淆了 classes 和 instances。在您的 switch_button()
方法中,您的代码:
ScreenManager.current = "FileScreen"
正在设置 ScreenManager
class 的 current
属性,但是 current
属性 是一个实例 属性 并且必须在 ScreenManager
的实例上设置。它必须是管理 FileScreen
Screen
.
switch_button()
方法的更好编码:
class MainScreen(Screen):
def switch_button(self):
print("switching")
self.manager.current = "FileScreen"
self.manager
是对管理 MainScreen
的 ScreenManager
的引用,MainScreen
也管理 FileScreen
。
在其他地方,您在 class 和实例之间进行了类似的混淆:
MainScreen.switch_button(self)
同样,您需要 MainScreen
的实例,而不是 MainScreen
class 的实例。此行可以替换为:
self.root.get_screen('MainScreen').switch_button()
此代码使用ScreenManager
的get_screen()
方法访问MainScreen
的实例,然后调用switch_button()
.
更直接的方法是将该行替换为:
self.root.current = 'FileScreen'