如何解决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,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))
# 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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。