使用Tkinter和win32api监听鼠标,调用after方法仍致程序崩溃如何解决
问题根因
- 你在函数中使用了
time.sleep(0.1),Tkinter基于单线程事件循环运行,sleep会直接阻塞整个主线程,导致界面无响应,时间久了就会被系统判定为崩溃 - 当前
root.after(100,on_press)仅在左键按下的分支中执行,只要有一次没有检测到按键按下,监听轮询就会直接终止,不符合持续监听的需求 - 没有做重复调度防护,多次触发after调度后会导致同一个函数被重复执行,累积到一定程度就会引发栈溢出崩溃
修复代码
import win32api import tkinter as tk root = tk.Tk() # 监听状态标记,避免重复注册、方便终止监听 is_listening = True # 可选:增加上一次按键状态标记,区分单次按下和长按,避免重复触发 last_press_state = False def on_press(): global last_press_state if not is_listening: return leftBtn = 0x01 key = win32api.GetKeyState(leftBtn) current_press = key < 0 if current_press and not last_press_state: print("Left click pressed") last_press_state = current_press # 把after调度放到分支外,保证无论是否检测到按键,都持续下一次轮询 root.after(100, on_press) # 启动首次监听 root.after(100, on_press) root.mainloop()
额外说明
- 原代码中的sleep逻辑不需要额外添加,after本身已经控制了100ms的轮询间隔,不会占用过高CPU
- 如果需要终止监听,只需将
is_listening设为False即可,不会残留后台调度任务
内容的提问来源于stack exchange,提问作者RuthIsRoot
相关产品推荐
相关产品推荐

