canvas - 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()
解决方案
推荐阅读
- python - 如何查看用户是否处于多对多关系中?
- django - 使用 json.dumps 和普通 python 字典发送数据有什么区别?
- spring - 验证字段何时相互依赖
- java - 从 .xlsx 读取特定工作表并写入另一个 .xlsx
- javascript - 通过 websocket 发送 blob 导致页面重新加载
- javascript - 添加图像以响应动态链接
- r - 使用 ggplot 的时间序列数据:如何为每个时间点使用不同的颜色并与属于每个主题的线条数据连接?
- mysql - 尝试上传图像时 Multer 出错
- java - Android在某些部分显示文本语言错误
- python - 图像下载但字节大小为 0 同时响应是 respons.ok 和 python 中的 200 代码?