【问题标题】:Access an instance of a class from another class in Kivy (Python)从 Kivy (Python) 中的另一个类访问一个类的实例
【发布时间】:2023-01-07 02:38:19
【问题描述】:

我有一个屏幕管理器中有屏幕管理器的程序,试图创建一个更动态的用户界面(我认为这会导致性能很差)。问题是我需要一个屏幕管理器中的类中的按钮来切换另一个屏幕。

但是,带有按钮的类无法访问屏幕管理器的实例,因为它本身位于不同的类中。我试图将实例作为变量传递,但我认为事件顺序发生的顺序错误,因此没有传递任何内容。

我写了一个例子来展示我想要达到的目标。由于这个问题,这段代码没有运行,但它希望能突出我的错误。

主程序

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager

class MASTER(ScreenManager):
    pass

class WidgetControlOne(ScreenManager):
    pass

class WidgetControlTwo(ScreenManager):
    pass

class MainScreen(Screen):
    pass

class ColourControls(Screen):
    def function(self, instance_of_WidgetControlOne):
        instance_of_WidgetControlOne.current = '_a_'

class AngleControls(Screen):
    pass

class FileOutput(Screen):
    pass

class ConfirmLockOveride(Screen):
    pass

class QuestionApp(App):
    pass


if __name__ == '__main__':
    QuestionApp().run()

问题.kv

MASTER:

<MASTER>:
    id: screen_manager
    MainScreen:

<WidgetControlOne>:
    widget_manager_two_instance_a:
    ColourControls:
        widget_manager_two_instance_b: widget_manager_two_instance_a
    AngleControls:

<WidgetControlTwo>:
    FileOutput:
    ConfirmLockOveride:


<MainScreen>:
    BoxLayout:
        WidgetControlTwo:
            id: widget_control_two
        WidgetControlOne:
            widget_manager_two_instance_a: widget_control_two

# Part of manager 1
<ColourControls>:
    # Needs to be able to change screen in manager 2
    widget_manager_two_instance_b:
    BoxLayout:
        Button:
            on_press: root.function(widget_manager_two_instance_b)

<AngleControls>:
    BoxLayout:

<FileOutput>:
    BoxLayout:

<ConfirmLockOveride>:
    name: '_a_'
    BoxLayout:

感谢您的任何帮助。

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    我不知道这是不是你想要的,我想你想从右屏幕控制左屏幕:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import Screen, ScreenManager
    
    KV = '''
    MASTER:
    
    <MASTER>:
        id: screen_manager
        MainScreen:
            name: 'main_screen'
    
    <WidgetControlOne>:
        ColourControls:
        AngleControls:
    
    <WidgetControlTwo>:
        FileOutput:
            name: 'one'
        ConfirmLockOveride:
            name: 'two'
        
    
    <MainScreen>:
        manager2: widget_control_two
        BoxLayout:
    
            # manager 2
            WidgetControlTwo:
                id: widget_control_two
    
            # manager 1
            WidgetControlOne:
                id: widget_control_one
                main_screen: root.manager2
    
    # Part of manager 1
    <ColourControls>:
        BoxLayout:
            Button:
                text: 'ColourControls'
                on_release: 
                    if root.manager.main_screen.current == 'one' : root.manager.main_screen.current = 'two';
                    else: root.manager.main_screen.current = 'one'
    
    <AngleControls>:
        Button: 
            text: 'AngleControls Screen'
            
    # Part of manager 2
    <FileOutput>:
        Button: 
            text: 'FileOutput'
    
    <ConfirmLockOveride>:
        Button: 
            text: 'ConfirmLockOveride'
    '''
    
    
    class MASTER(ScreenManager):
        pass
    
    
    class WidgetControlOne(ScreenManager):
        pass
    
    
    class WidgetControlTwo(ScreenManager):
        pass
    
    
    class MainScreen(Screen):
        pass
    
    
    class ColourControls(Screen):
        pass
    
    
    class AngleControls(Screen):
        pass
    
    
    class FileOutput(Screen):
        pass
    
    
    class ConfirmLockOveride(Screen):
        pass
    
    
    class QuestionApp(App):
    
        def build(self):
            return Builder.load_string(KV)
    
    
    if __name__ == '__main__':
        QuestionApp().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      相关资源
      最近更新 更多