[英]How can I change screen using bottom sheet in kivymd?
我在 kivymd 中制作了一个简单的应用程序。 但是我无法通过单击 kivymd 中的按钮来更改屏幕。 一切都很好。 但是当我点击按钮时,它也会弹出吐司,但屏幕没有改变。 对此有何变化或更好的实施?
应用程序
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from main_screen_str import helper_string
from kivy.core.window import Window
from kivymd.toast import toast
from kivymd.uix.bottomsheet import MDGridBottomSheet
Window.size = (300, 500)
class MainScreen(Screen):
pass
class SettingsScreen(Screen):
pass
class AboutScreen(Screen):
pass
class MainApp(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.sm = ScreenManager()
self.sm.add_widget(MainScreen(name="main_screen"))
self.sm.add_widget(SettingsScreen(name="settings_screen"))
self.sm.add_widget(AboutScreen(name="about_screen"))
self.main_str = Builder.load_string(helper_string)
def build(self):
screen = Screen()
screen.add_widget(self.main_str)
return screen
def callback_for_menu_items(self, *args):
if args[0] == 'Home':
toast(args[0])
self.sm.current = "main_screen"
if args[0] == 'Settings':
toast(args[0])
self.sm.current = "settings_screen"
if args[0] == 'About':
toast(args[0])
self.sm.current = "about_screen"
def show_example_grid_bottom_sheet(self):
self.bottom_sheet_menu = MDGridBottomSheet()
data = {
"Home": "home",
"Settings": "settings",
"About": "information-outline",
}
for item in data.items():
self.bottom_sheet_menu.add_item(
item[0],
lambda x, y=item[0]: self.callback_for_menu_items(y),
icon_src=item[1],
)
self.bottom_sheet_menu.open()
if __name__ == '__main__':
MainApp().run()
此构建器字符串用于创建屏幕。 有没有更好的解决方案?
生成器字符串
helper_string = """
ScreenManager:
MainScreen:
SettingsScreen:
AboutScreen:
<MainScreen>:
name: 'main_screen'
MDIconButton:
icon: "menu"
theme_text_color: "Custom"
text_color: 1,0,0,1
on_press: app.show_example_grid_bottom_sheet()
<SettingsScreen>:
name: 'settings_screen'
<AboutScreen>:
name: 'about_screen'
"""
在App
__init__()
方法中,您正在使用以下行构建self.sm
:
self.sm = ScreenManager()
self.sm.add_widget(MainScreen(name="main_screen"))
self.sm.add_widget(SettingsScreen(name="settings_screen"))
self.sm.add_widget(AboutScreen(name="about_screen"))
但是self.sm
不用作 GUI 的一部分。 因此,您对self.sm
的更改对您的 GUI 没有影响。 以下行:
self.main_str = Builder.load_string(helper_string)
基本上与前几行完全相同。
然后在你的build()
方法,您要创建一个新的Screen
,并加入self.main_str
作为的子Screen
。
虽然您可以将ScreenManager
作为Screen
的子项,但在您发布的示例中似乎没有任何用途。
这是MainApp
部分的修改版本,我认为它MainApp
您的需求:
class MainApp(MDApp):
# def __init__(self, **kwargs):
# super().__init__(**kwargs)
# self.sm = ScreenManager()
# self.sm.add_widget(MainScreen(name="main_screen"))
# self.sm.add_widget(SettingsScreen(name="settings_screen"))
# self.sm.add_widget(AboutScreen(name="about_screen"))
#
# self.main_str = Builder.load_string(helper_string)
def build(self):
self.sm = Builder.load_string(helper_string)
return self.sm
# screen = Screen()
# screen.add_widget(self.main_str)
# return screen
上面的代码大大简化了build()
方法,去掉了__init__()
方法,现在self.sm
实际上是 GUI 的一部分。
请注意,当您使用Builder.load_string()
加载具有根节点的kv
字符串时,将创建并返回该根节点。 您的kv
字符串中的行:
ScreenManager:
MainScreen:
SettingsScreen:
AboutScreen:
结果是创建了一个ScreenManager
实例以及为其列出的三个子项,因此__init__()
方法中的代码正在复制它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.