使用PySimpleGUI sg.pin消除元素隐藏留白无效的问题求助
问题:PySimpleGUI sg.pin无法消除元素隐藏后的留白
想要用PySimpleGUI的sg.pin功能消除元素设为不可见时的留白,但功能没生效。操作后隐藏部分元素(非全部)时,留白依然存在——比如输入5显示5个输入框,输入2后,被隐藏的3个仍占空间。原代码如下:
import PySimpleGUI as sg def vehicles(num): return sg.pin(sg.Column([sg.Text('Start time:',visible=False), sg.Input(size=(3,1), key=f'start{i}', visible=False), sg.Text('End time:',visible=False) , sg.Input(size=(3,1), key=f'end{i}', visible=False)] for i in range(num)) ) layout = [ [sg.Input(key = '1')], [vehicles(10)], [sg.pin(sg.Column([[sg.Button("Submit")], [sg.Button('Exit')]]))] ] window = sg.Window('test',layout) while True: event, values = window.read() if event == sg.WIN_CLOSED or event=="Exit": break if event == 'Submit': for i in range(int(values['1'])): window[f'start{i}'].update(visible=True) for i in range(int(values['1']), 10): # invisualize rest window[f'start{i}'].update(visible=False)
修复方案
问题根源
sg.pin被错误套在了整个大Column外层,它需要作用在单个可隐藏的元素/行上——整个大Column会占据固定空间,内部元素隐藏不会让Column收缩。- 原代码只控制了
start{i}输入框的可见性,对应的Text和end{i}输入框没同步处理,这些元素依然占位。 vehicles函数的列表推导写法错误,生成的是零散元素而非完整行结构。
修改后代码
把每一行(包含文本和输入框)单独用sg.pin包裹,同时同步控制该行所有元素的可见性:
import PySimpleGUI as sg def vehicles(num): rows = [] for i in range(num): # 为每行单独创建带sg.pin的Column,确保隐藏时不占位 row_content = [ sg.Text('Start time:', visible=False, key=f'start_text{i}'), sg.Input(size=(3,1), key=f'start{i}', visible=False), sg.Text('End time:', visible=False, key=f'end_text{i}'), sg.Input(size=(3,1), key=f'end{i}', visible=False) ] rows.append([sg.pin(sg.Column([row_content]))]) return sg.Column(rows) layout = [ [sg.Input(key='1')], [vehicles(10)], [sg.Button("Submit"), sg.Button('Exit')] ] window = sg.Window('test', layout) while True: event, values = window.read() if event == sg.WIN_CLOSED or event == "Exit": break if event == 'Submit': show_count = int(values['1']) for i in range(10): visible = i < show_count # 同步控制该行所有元素的可见性 window[f'start_text{i}'].update(visible=visible) window[f'start{i}'].update(visible=visible) window[f'end_text{i}'].update(visible=visible) window[f'end{i}'].update(visible=visible) window.close()
关键修改说明
- 每行元素都被
sg.pin包裹,隐藏时会彻底移除该行的占位空间。 - 给文本元素添加唯一key,方便直接控制可见性,避免复杂的父元素查找操作。
- 提交事件中统一处理每行所有元素,确保显示/隐藏状态完全同步。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

