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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:48:02