使用框架在pysimpleGUI中实现动态布局

0 投票
1 回答
28 浏览
提问于 2025-04-14 16:24

(我问题的解释在最后)

这里有一个动态布局的例子,当我点击一个按钮时,会添加一个框架。程序启动时的状态:

这里输入图片描述

然后在按钮被按下后:

这里输入图片描述

这是代码:

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

那么结果就是这个:

在这里输入图片描述

唯一的问题是按钮没有固定在底部,你知道怎么解决这个问题吗?

撰写回答