Python/Kivy:如何在屏幕管理器调用时将参数传递给类

问题描述 投票:0回答:1

我用 Python/Kivy/KivyMD 开发了一个 UI。这是一个简单的应用程序,其中三个屏幕由三个不同的类定义:View1View2View3。在类 '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()
python kivy kivy-language kivymd
1个回答
0
投票

在您的

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)
© www.soinside.com 2019 - 2024. All rights reserved.