PySimpleGUI动态显示隐藏项后滚动条失效问题求助
问题原因分析
PySimpleGUI的滚动Column组件是基于初始布局的元素尺寸计算可滚动区域大小的。当你把某一行的所有元素都设为visible=False时,该行会被判定为无高度的空行,导致内部Column的总高度远小于外层滚动Column的固定高度(300px),滚动条因此无法激活。而保留一个可见元素时,行的高度被正常计算,总高度超过外层容器高度后滚动条就会生效。
解决方法
下面提供两种可靠的解决方案:
方案1:用sg.pin保持不可见元素的空间
sg.pin的作用是让元素即使不可见,也会占据原本的布局空间,这样每一行的高度不会因为元素隐藏而消失,滚动区域的总高度就能正确计算。
修改addParLine函数,把整行元素用sg.pin包裹:
def addParLine(index): text_index = str(index) if index < 10: text_index = "0" + text_index KEY_LABEL_INDEX = PREFIX_PAR_LABEL_INDEX + text_index KEY_LABEL_NAME = PREFIX_PAR_LABEL_NAME + text_index KEY_LABEL_VALUE = PREFIX_PAR_LABEL_VALUE + text_index KEY_BUTTON_READ = PREFIX_PAR_BUTTON_READ_VALUE + text_index KEY_BUTTON_SEND = PREFIX_PAR_BUTTON_SEND_VALUE + text_index line_elements = [ sg.Text( key=KEY_LABEL_INDEX, text=text_index, size=LABEL_SIZE_05, justification=ALIGN_CENTER, visible=False, pad=5, ), sg.Text( '', key=KEY_LABEL_NAME, size=LABEL_SIZE_20, relief=sg.RELIEF_SUNKEN, justification=ALIGN_CENTER, visible=False, pad=5, ), sg.InputText( '', key=KEY_LABEL_VALUE, size=LABEL_SIZE_30, justification=ALIGN_LEFT, text_color=Blue2, background_color=LightGrey, enable_events=True, visible=False, pad=5, ), sg.Button( key=KEY_BUTTON_READ, button_text='Leggi', size=BUTTON_SIZE_14, button_color=BUTTON_COLOR_BLUE, visible=False, pad=5, ), sg.Button( key=KEY_BUTTON_SEND, button_text='Invia', size=BUTTON_SIZE_14, button_color=BUTTON_COLOR_BLUE, visible=False, pad=5, ), ] # 用sg.pin包裹整行,保留布局空间 return [sg.pin(line_elements)]
修改后,即使所有元素隐藏,每一行的高度依然保留,外层滚动Column能正确计算总高度,滚动条即可正常使用。
方案2:动态添加元素(更高效)
PySimpleGUI支持动态创建组件,无需预先创建所有行。读取文件后按需往Column里添加元素,布局更灵活,还能避免空行占用空间。
步骤1:初始化空布局
修改initLayoutBody函数,让滚动Column初始布局为空:
def initLayoutBody(): layout = [ [ sg.Text(text="##", size=LABEL_SIZE_05, text_color=DarkOrange, justification=ALIGN_CENTER, pad=5), sg.Text(text="Nome", size=LABEL_SIZE_20, text_color=DarkOrange, justification=ALIGN_CENTER, pad=5), sg.Text(text="Valore", size=LABEL_SIZE_30, text_color=DarkOrange, justification=ALIGN_CENTER, pad=5), ], [ sg.Column( key=KEY_FRAME_PARS, size=(750, 300), layout=[[]], # 初始空布局 element_justification=ALIGN_LEFT, scrollable=True, vertical_scroll_only=True, background_color=DarkGreen, ), ] ] return layout
步骤2:读取文件后动态添加行
读取文件获取需要展示的行数后,用window.extend_layout添加元素并设置可见:
# 示例:读取文件后得到需要展示的行数n n = 20 # 替换为实际读取的行数 for index in range(n): # 生成行布局 line = addParLine(index) # 往滚动Column中添加行 window.extend_layout(window[KEY_FRAME_PARS], line) # 显示当前行的所有元素 idx_str = str(index).zfill(2) window[PREFIX_PAR_LABEL_INDEX + idx_str].update(visible=True) window[PREFIX_PAR_LABEL_NAME + idx_str].update(visible=True) window[PREFIX_PAR_LABEL_VALUE + idx_str].update(visible=True) window[PREFIX_PAR_BUTTON_READ_VALUE + idx_str].update(visible=True) window[PREFIX_PAR_BUTTON_SEND_VALUE + idx_str].update(visible=True)
这种方法仅创建需要的元素,内存占用更低,滚动条会因动态添加元素的总高度超过容器高度而自动激活。
内容的提问来源于stack exchange,提问作者Tirrel
相关产品推荐
相关产品推荐

