如何在PySimpleGUI中选择Facet类型后动态添加参数输入框?
实现PySimpleGUI动态添加参数输入框
完整代码实现
import PySimpleGUI as sg Facets = { 'Entity' : {'facet_type': 'Entity' , 'facet_parameters': ['IFC Class' , 'Predefined Type']}, 'Attribute' : {'facet_type': 'Attribute' , 'facet_parameters': ['Name' , 'Value']}, 'Classification': {'facet_type': 'Classification', 'facet_parameters': ['System' , 'Value']}, 'Property' : {'facet_type': 'Property' , 'facet_parameters': ['Property Set', 'Name', 'Value']}, 'Material' : {'facet_type': 'Material' , 'facet_parameters': ['Value']}, 'Parts' : {'facet_type': 'Parts' , 'facet_parameters': ['Entity' , 'Relationship']} } # 初始布局:添加参数容器 layout = [ [sg.Text('All elements of'), sg.Combo(sorted(Facets.keys()), key='-FACET-', enable_events=True)], # 预留参数输入区域的容器 [sg.Column([], key='-PARAMS_CONTAINER-', expand_x=True)] ] window = sg.Window('IDS', layout, resizable=True) while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break elif event == '-FACET-': selected_facet = values['-FACET-'] facet_parameters = Facets[selected_facet]['facet_parameters'] # 清空之前的参数输入元素 window['-PARAMS_CONTAINER-'].update([]) # 生成新的参数输入行 param_layout = [] for idx, param_name in enumerate(facet_parameters): # 给每个输入框设置唯一key,方便后续取值 param_layout.append([ sg.Text(f'{param_name}:'), sg.Input(key=f'-PARAM_{idx}-', expand_x=True) ]) # 将新布局添加到容器中 window.extend_layout(window['-PARAMS_CONTAINER-'], param_layout) # 刷新窗口以显示新元素 window.refresh() window.close()
关键步骤说明
- 预留容器:初始布局中添加一个空的
sg.Column作为参数输入的承载容器,通过唯一key定位。 - 清空旧元素:每次切换facet类型时,调用
window['-PARAMS_CONTAINER-'].update([])清空容器内所有旧元素,避免重复叠加。 - 生成新布局:遍历选中facet的参数列表,为每个参数生成包含标签和输入框的行,每个输入框设置唯一key,方便后续获取用户输入值。
- 扩展布局:使用
window.extend_layout()方法将新生成的参数行添加到容器中,最后调用window.refresh()刷新窗口,让新元素立即显示。
内容的提问来源于stack exchange,提问作者Enrra
相关产品推荐
相关产品推荐

