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

如何让自动搜索功能在PySimpleGUI的所有新标签页中生效?

PySimpleGUI动态添加标签页并自动搜索功能修复

问题根源分析

你的代码崩溃主要来自两个核心问题:

  1. 初始标签页的key格式与新增标签页不一致,导致更新标题时找不到对应元素
  2. 每次事件循环遍历所有索引的逻辑,不仅效率低,还会在新标签页刚添加时引发未初始化元素的访问问题

修复后的完整代码

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,提问作者Егор Ильин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:15:20