如何让自动搜索功能在PySimpleGUI的所有新标签页中生效?
PySimpleGUI动态添加标签页并自动搜索功能修复
问题根源分析
你的代码崩溃主要来自两个核心问题:
- 初始标签页的
key格式与新增标签页不一致,导致更新标题时找不到对应元素 - 每次事件循环遍历所有索引的逻辑,不仅效率低,还会在新标签页刚添加时引发未初始化元素的访问问题
修复后的完整代码
import PySimpleGUI as sg keywords = ['Azocompound','Aloin',"Quercetin"] font = ('Helvetica', 16) def tab(i): return [ [sg.Text('Choose ligand', font=font)], [sg.Input('', size=(20, 1), font=font, enable_events=True, key=f'-IN-{i}')], [sg.Listbox(values=[], size=(20, 3), enable_events=True, key=f'-BOX-{i}', font=font, select_mode=sg.LISTBOX_SELECT_MODE_SINGLE)] ] index = 5 # 统一所有标签页的key格式为'Tab {i}' tabgroup = [[sg.Tab(f'Tab {i}' if i < index -1 else '+', tab(i), key=f'Tab {i}') for i in range(index)]] layout = [ [sg.Text('Input ligand name:', font=font)], [sg.TabGroup(tabgroup, key='TabGroup', font=font)], [sg.Submit('Start', font=font), sg.Cancel(font=font)] ] window = sg.Window('AutoComplete', layout, finalize=True) window['TabGroup'].bind('<<NotebookTabChanged>>', '+Switch') while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break elif event == 'TabGroup+Switch': # 从选中标签的key中提取索引 current_tab_key = values['TabGroup'] i = int(current_tab_key.split(' ')[1]) if i == index -1: # 更新当前"+"标签的标题 window[current_tab_key].update(title=f'Tab {i}') # 添加新的"+"标签页 window['TabGroup'].add_tab(sg.Tab('+', tab(index), key=f'Tab {index}')) index += 1 # 处理输入框的自动补全事件 elif event.startswith('-IN-'): j = int(event.split('-')[2]) text = values[event] match_list = [item for item in keywords if item.startswith(text)] if text else [] window[f'-BOX-{j}'].update(values=match_list) # 处理列表框的选中填充事件 elif event.startswith('-BOX-'): j = int(event.split('-')[2]) selected_item = values[event] if selected_item: window[f'-IN-{j}'].update(value=selected_item[0]) window.close()
关键修复点说明
- 统一标签页key格式:所有标签页使用
Tab {i}作为key,确保切换和更新时能准确找到元素 - 优化事件处理逻辑:不再遍历所有索引,通过判断事件前缀直接提取对应索引,提升效率同时避免范围错误
- 修正标题更新方式:直接使用当前选中标签的key访问元素,避免因key不匹配导致的查找失败
- 列表框值处理:Listbox返回的是列表类型,取第一个元素填充输入框,避免空值引发的异常
内容的提问来源于stack exchange,提问作者Егор Ильин
相关产品推荐
相关产品推荐

