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

PySimpleGUI点击Go按钮后代码执行次数逐次递增问题求助

问题根因
  1. 日志处理器重复注册:monitor_logging函数被放在事件循环内部,每次window.read()返回任意事件后都会执行一次。该函数每次调用都会向全局logging实例新增日志处理器,没有去重或清理逻辑,每触发一次事件就多一个日志输出通道,最终出现点击次数越多、重复执行/日志输出次数越多的现象。
  2. 事件循环逻辑冗余:代码重复判断窗口关闭事件,sg.WINDOW_CLOSED与sg.WIN_CLOSED为完全等价的常量,原有关闭逻辑存在漏洞,可能导致后台事件队列残留,进一步触发重复执行。
修复方案

1. 调整事件循环结构,全局仅初始化一次日志

将日志初始化逻辑移到事件循环外,统一处理窗口关闭逻辑,修复后代码如下:

# 日志初始化放到事件循环外,全局仅执行一次
logger = monitor_logging(values['log_level'], log_path, 1000000)
logger.warning(values['log_level'] + " log set has been established.")

while True:
    event, values = window.read()

    # 统一处理窗口关闭逻辑
    if event in (sg.WINDOW_CLOSED, 'Close'):
        break

    if event == 'Go':
        redirect_uri = 'http://test.test.com:9015/callback/catcher'
        response = dict()

        authorize = Authorize(
            values['http_type'],
            values['server'],
            values['port'],
            values['client_id'],
            redirect_uri,
            values['loginname'],
            values['password'],
            None,  # endpoint
            None,  # header
            response,  # response
            int(values['timeout']),  # timeout 必须为整数
            int(values['acr_values']),  # acr values 必须为整数
            values['response_type'],
            values['scope'],
            values['state'],
            values['nonce'])

        authorize.http_get(values['acr_values'])  # 传入acr_value参数

        if authorize.response['connection_code'] == 0 \
                and 100 < len(authorize.response['requests'].text) < 110:
                    print(authorize.response['requests'].text)
        else:
            sg.popup_error('Authorize - 连接超时错误')

# 循环结束后统一关闭窗口
window.close()

2. 优化日志初始化函数

如果monitor_logging为自定义实现,添加清理已有Handler的逻辑,避免偶发的重复调用导致日志重复:

def monitor_logging(log_level, log_path, max_size):
    logger = logging.getLogger()
    # 先清空已有Handler,避免重复注册
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
    # 原有设置日志等级、添加FileHandler/StreamHandler等逻辑保持不变
    ...

3. 补充检查项

检查标签页初始化逻辑,确认Go按钮未重复绑定事件回调,标签页切换时不会重复启动事件循环。

内容的提问来源于stack exchange,提问作者Germán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:57:04