我用 Python/Kivy/KivyMD 开发了一个 UI。这是一个简单的应用程序,其中三个屏幕由三个不同的类定义:View1、View2 和View3。在类 'MainApp' 中定义了一个屏幕管理器,用于在屏幕之间切换。屏幕之间的切换发生在用户单击按钮时,并由调用屏幕管理器的事件管理。 第三个屏幕 (View3) 也包含一个标签。如何将参数/变量从 View1 传递到 View3?我想在此标签中显示一些来自 View1 的文本(请参阅注释行)。通常,如何从另一个类(例如 View1)定义 View3 中的全局变量? 这是代码:
from kivy.lang import Builder
from kivymd.app import MDApp
#from kivy.uix.screenmanager import NoTransition, SwapTransition, SlideTransition, FallOutTransition
from kivymd.uix.transition import MDSwapTransition, MDSlideTransition
from kivymd.uix.screenmanager import MDScreenManager
from kivymd.uix.screen import MDScreen
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
Builder.load_string(
"""
<View3>:
MDRelativeLayout:
MDLabel:
id: label_view3
halign: 'center'
MDRaisedButton:
text: 'GO TO VIEW 1'
pos_hint: {'center_x': 0.7, 'center_y': 0.7}
on_release: root.switch_to_screen1()
<View2>:
MDRaisedButton:
text: 'GO TO VIEW 3'
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
on_release: root.switch_to_screen3()
<View1>:
sm_view1: sm_view1
tabs: tabs
MDAnchorLayout:
anchor_x: 'center'
anchor_y: 'top'
MDBoxLayout:
size_hint: 1, 0.2
orientation: 'vertical'
MDTabs:
id: tabs
on_tab_switch: root.Tab_Switch(*args)
MDAnchorLayout:
anchor_x: 'center'
anchor_y: 'bottom'
MDScreenManager:
size_hint: 1, 0.8
id: sm_view1
MDScreen:
name: 'screen1'
MDLabel:
text: 'VIEW 1'
halign: 'center'
MDScreen:
name: 'screen2'
MDRaisedButton:
text: 'GO TO VIEW 2'
pos_hint: {'center_x': 0.3, 'center_y': 0.3}
on_release: root.switch_to_screen2()
"""
)
class Tab(MDFloatLayout, MDTabsBase):
'''Class implementing content for a tab.'''
class View3(MDScreen):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def switch_to_screen1(self):
MDApp.get_running_app().sm.current = 'view1'
# def WriteInTheLabel(Text):
# self.ids.label_view3.text = Text
class View2(MDScreen):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def switch_to_screen3(self):
MDApp.get_running_app().sm.current = 'view3'
class View1(MDScreen):
sm_view1: MDScreenManager
tabs: Tab
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.tabsTitles = ['SCREEN 1', 'SCREEN 2']
self.Tab_Start()
def Tab_Start(self):
for label in self.tabsTitles:
self.ids.tabs.add_widget(Tab(title=label))
def Tab_Switch(
self, instance_tabs, instance_tab, instance_tab_label, tab_text
):
'''Called when switching tabs.
:type instance_tabs: <kivymd.uix.tab.MDTabs object>;
:param instance_tab: <__main__.Tab object>;
:param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
:param tab_text: text or name icon of tab;
'''
if tab_text == self.tabsTitles[0]:
self.sm_view1.current = 'screen1'
elif tab_text == self.tabsTitles[1]:
self.sm_view1.current = 'screen2'
def switch_to_screen2(self):
MDApp.get_running_app().sm.current = 'view2'
# Pass some text here
# How can I find an istance of View3 from here?
#MDApp.get_running_app().view3.WriteInTheLabel('MSG FROM VIEW 1')
class MainApp(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.sm = MDScreenManager(transition = MDSwapTransition())
self.sm.add_widget(View1(name="view1"))
self.sm.add_widget(View2(name="view2"))
self.sm.add_widget(View3(name="view3"))
def build(self):
return self.sm
if __name__ == '__main__':
MainApp().run()
在您的
switch_to_screen2()
方法中,您可以使用manager
的Screen
属性来获取它的ScreenManager
。然后使用get_screen()
的ScreenManager
方法得到一个Screen
的实例的引用:
def switch_to_screen2(self):
MDApp.get_running_app().sm.current = 'view2'
# Pass some text here
# How can I find an istance of View3 from here?
# MDApp.get_running_app().view3.WriteInTheLabel('MSG FROM VIEW 1')
view3 = self.manager.get_screen('view3')
print(view3.ids.label_view3.text)