PySimpleGUI点击Go按钮后代码执行次数逐次递增问题求助
问题根因
- 日志处理器重复注册:
monitor_logging函数被放在事件循环内部,每次window.read()返回任意事件后都会执行一次。该函数每次调用都会向全局logging实例新增日志处理器,没有去重或清理逻辑,每触发一次事件就多一个日志输出通道,最终出现点击次数越多、重复执行/日志输出次数越多的现象。 - 事件循环逻辑冗余:代码重复判断窗口关闭事件,
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
相关产品推荐
相关产品推荐

