首页 > 解决方案 > Kivy 动态添加布局

问题描述

我有以下问题:我通过调用我的函数 advanced_mode() 的按钮将布局动态添加到各种屏幕。除此之外,我动态更改布局上的按钮,这就是我构建函数 sm_switcher() 和 sm_build_button_bar() 的原因。随机添加的布局中的小部件未对齐,按钮图形未加载等。我怎样才能解决这个问题?我是否必须以不同的方式创建/实例化布局类,或者我在某处缺少 .do_layout() 或 _trigger_layout() ?我希望我的例子足够清楚。

动态添加布局后未对齐的小部件


class LaserAdvanced(GridLayout):  # issue-layout, instanciated in function initialization() in BoxL
    pass

class LaserAdvancedButtons(BoxLayout):
    pass

class T2Button(Button):
    pass

class BoxL(BoxLayout):  # This is my main-class
    def __init__(self):
        super().__init__()

    def advanced_mode(self):  # This is the function which adds and removes the issue-layouts
        """Switch to advanced mode of current screen."""
        screen_id = self.ids.sm.current

        if screen_id == 'laserScreen':
            if not self.laser_advanced_active:
                print('Enabling laser advanced mode ..')
                self.ids.laser_screen_master_box.add_widget(self.laser_screen_advanced_box)
                self.ids.bottom_button_box.clear_widgets()
                self.ids.bottom_button_box.add_widget(self.laser_screen_advanced_buttons)
                self.laser_advanced_active = True
            else:
                print('Disabling laser advanced mode ..')
                self.ids.laser_screen_master_box.remove_widget(self.laser_screen_advanced_box)
                self.sm_build_button_bar('laserScreen')
                self.laser_advanced_active = False

    def sm_switcher(self, go_to_screen):  # this replaces sm.current = 'SCREENNAME'
        """Switch Screen depending on their order to left/right accordingly.
        
        Parameters
        ----------
        go_to_screen : string
            Screen ID defined in kivy file
        """
        for idx, scr in enumerate(self.ids.sm.screen_names):
            if go_to_screen == scr:
                goto_index_ = idx
            if self.ids.sm.current == scr:
                current_index_ = idx

        if current_index_ > goto_index_:
            self.ids.sm.transition.direction = 'right'
        if current_index_ < goto_index_:
            self.ids.sm.transition.direction = 'left'

        self.lastScreen = go_to_screen
        self.sm_build_button_bar(go_to_screen)
        #self.ids.sm.canvas.ask_update()  # something i tried to fix the bug
        self.ids.sm.current = go_to_screen

    def sm_build_button_bar(self, go_to_screen):
        """Builds the button box above the colored bottom line for each screen individually."""

        self.ids.bottom_button_box.clear_widgets()

        if go_to_screen == 'laserScreen':
            first_element = Label()  # placeholder
            second_element = Label()  # placeholder
            third_element = Label()  # placeholder
            fourth_element = T2Button(text='Reset Laser', color=(0, 0, 0, 1))
            fourth_element.on_release = lambda *args: print('doing stuff')

        self.ids.bottom_button_box.add_widget(first_element)
        self.ids.bottom_button_box.add_widget(second_element)
        self.ids.bottom_button_box.add_widget(third_element)
        self.ids.bottom_button_box.add_widget(fourth_element)

    def initialization(self):  # this is some function which i call after a login, so after something already happened in the GUI
        print('Doing some stuff before ..')
        print('Instancing Advanced classes ..')
        BoxL.laser_screen_advanced_box = LaserAdvanced(cols=4, spacing=(0, 10), padding=(0, 10, 0, 0))
        # BoxL.laser_screen_advanced_box.do_layout()  # also something i tried to fix the bug
        BoxL.laser_screen_advanced_buttons = LaserAdvancedButtons()   


class GUI_T2(App):
    """GUI_T2 class."""

    def build(self):
        """Build function with rest of config which doesnt work from GUI_T2.ini."""
        Builder.load_file('style.kv')  # here i load some button styles and so on
        Builder.load_file('layouts.kv')  # here i load the issue-layout(s) (LaserAdvanced)
        # BoxL.laser_screen_advanced_box = LaserAdvanced()  # something i tried aswell
        self.title = 'My GUI'
        return BoxL()


if __name__ == "__main__":
    GUI_T2().run()

标签: canvaslayoutdynamickivykivy-language

解决方案


推荐阅读