You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)
修复方案

问题根源

  1. sg.pin被错误套在了整个大Column外层,它需要作用在单个可隐藏的元素/行上——整个大Column会占据固定空间,内部元素隐藏不会让Column收缩。
  2. 原代码只控制了start{i}输入框的可见性,对应的Text和end{i}输入框没同步处理,这些元素依然占位。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:20:41