[英]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.