从Kivy中的另一个类访问一个类的示例(Python)

qmelpv7a  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(102)

我有一个在屏幕管理器中包含屏幕管理器的程序,试图创建一个更动态的UI(我认为这会导致性能非常差)。问题是我需要一个在屏幕管理器中的类中的按钮来切换屏幕。
但是,带有按钮的类不能访问屏幕管理器的示例,因为它本身在另一个类中。我曾尝试将示例作为变量传入,但我认为事件的顺序发生得不对,因此没有传递任何内容。
我写了一个例子来展示我想要达到的目标。这段代码因为这个问题而没有运行,但是它希望能突出我的错误。

    • 主文件. py**
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:

谢谢你的帮助。

ftf50wuq

ftf50wuq1#

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

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()

相关问题