PyWebView关闭窗口后调用get_cookies报KeyError: 'master'求助
问题解决方法
错误原因分析
- KeyError: 'master':
webview.start()是阻塞调用,窗口关闭后,webview底层的浏览器实例已被销毁,此时调用window.get_cookies()会因为找不到对应实例而抛出KeyError。 - 窗口崩溃+进程无法终止:在
closing事件处理器中使用同步网络请求(urllib.request.urlopen)会阻塞UI线程,导致窗口无法正常完成关闭流程,最终造成进程僵死。
正确实现方式
使用线程处理网络请求,避免阻塞UI线程;同时在closing事件中安全获取cookies(此时窗口尚未完全销毁,实例仍存在):
import webview import sys import urllib.request import threading def send_cookies(cookies): # 在线程中执行网络请求,不阻塞UI url = f'{sys.argv[1]}/close?cookie={cookies}' try: urllib.request.urlopen(url) except Exception as e: print(f"发送请求失败: {e}") def on_closing(): # 窗口关闭前获取cookies cookies = window.get_cookies() # 启动线程处理网络请求 threading.Thread(target=send_cookies, args=(cookies,), daemon=True).start() window = webview.create_window( sys.argv[2], sys.argv[1], width=1280, height=720, min_size=(1280, 720) ) window.events.closing += on_closing webview.start( private_mode=False, storage_path='./gui' )
关键说明
- 使用
threading.Thread将网络请求放到后台线程,避免阻塞UI线程,保证窗口能正常关闭。 - 设置
daemon=True,确保主线程退出时后台线程也会自动终止,防止进程残留。 - 在
closing事件中获取cookies,此时窗口实例尚未被销毁,不会触发KeyError。
内容的提问来源于stack exchange,提问作者ThunderV42
相关产品推荐
相关产品推荐

