使用框架在pysimpleGUI中实现动态布局
(我问题的解释在最后)
这里有一个动态布局的例子,当我点击一个按钮时,会添加一个框架。程序启动时的状态:
然后在按钮被按下后:
这是代码:
import PySimpleGUI as sg
def layout_for_frame(lvl_1):
layout = [[sg.Frame(title = 'Frame level 2',
layout = [[sg.Text('Text 2 '), sg.Input(key=('-level two-',lvl_1))],
[sg.Combo(['A', 'B'],key=('-combo-',lvl_1))]],
relief = 'sunken')]]
return layout
def make_window():
layout = [[sg.Frame(title = 'Frame level 1',
layout = layout_for_frame(0),
key = '-Frame lvl 1-',
relief = 'groove')],
[sg.Button('+',key = 'add a level two Frame')]]
window = sg.Window('Window Title', layout,metadata=0)
return window
def main():
window = make_window()
while True:
event, values = window.read()
print(event, values)
if event == sg.WIN_CLOSED :
break
elif event == 'add a level two Frame' :
window.metadata += 1
window.extend_layout(window['-Frame lvl 1-'],(layout_for_frame(window.metadata)))
window.close()
if __name__ == '__main__':
main()
这个方法在一个框架里面添加另一个框架时效果很好。问题是我不知道怎么在没有布局元素的情况下,用一个键来调用一个函数来添加另一个一级框架:
layout = [[(layout_for_frame(0),key = '-CALL FOR FRAME-')],
[sg.Button('+',key = 'add a level one Frame')]]
这个方法不行,所以我不能使用之前展示的相同逻辑。
我的问题是,如何通过一个按钮直接添加一个一级框架?
如果有不清楚的地方,请告诉我,谢谢你花时间阅读这些内容。
1 个回答
0
好的,我找到了答案:
其实很简单,当你调用扩展窗口的时候,你只需要把它放在主窗口上,这样函数里面的所有内容就会显示在主窗口里。所以你只需要在函数中把框架设置为1级,像这样:
def layout_for_frame(lvl_1):
layout = [[sg.Frame(title = f'N° {lvl_1} Frame level 1',
layout = [[sg.Frame(title = 'Frame level 2',
layout = [[sg.Text('Text 2 '), sg.Input(key=('-level two-',lvl_1))],
[sg.Combo(['A', 'B'],key=('-combo-',lvl_1))]],
relief = 'sunken')],
[sg.Button('Add LVL 2 frame')]],
key = ('-Frame lvl 1-',lvl_1),
relief = 'groove')]]
return layout
然后当布局变成:
layout = [[layout_for_frame(0)],
[sg.Button('+',key = 'add a level one Frame')]]
关于调用:
elif event == 'add a level one Frame' :
window.metadata += 1
window.extend_layout(window,(layout_for_frame(window.metadata)))
那么结果就是这个:
唯一的问题是按钮没有固定在底部,你知道怎么解决这个问题吗?