pynput.mouse的Listener无法停止,如何设置键盘快捷键终止程序
问题根因
你编写的代码存在执行顺序逻辑错误:listener.join() 是阻塞调用,会持续等待pynput鼠标监听线程终止后才会执行后续代码,因此你写在其后方的键盘按键检测循环永远不会被触发,自然无法响应快捷键停止程序。
修正方案
你需要将鼠标监听设置为非阻塞运行,让主线程负责检测键盘按键,触发退出时先终止鼠标监听再结束进程即可。修正后完整代码如下:
import sys import pyautogui import keyboard from pynput.mouse import Listener def on_move(x, y): print ("Mouse moved to ({0}, {1})".format(x, y)) def on_click(x, y, button, pressed): try: #FOR AUTO FAIL-SAFE if pressed: print ('Mouse clicked at ({0}, {1}) with {2}'.format(x, y, button)) pyautogui.move(x+100,y+100) except: pass def on_scroll(x, y, dx, dy): print ('Mouse scrolled at ({0}, {1})({2}, {3})'.format(x, y, dx, dy)) # 非阻塞启动鼠标监听 listener = Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) listener.start() # 主线程负责检测按键 while True: if keyboard.is_pressed("q"): # 先终止鼠标监听线程再退出 listener.stop() listener.join() sys.exit(0)
额外注意事项
- 打包为exe后如果出现键盘检测无响应的问题,可尝试以管理员身份运行exe,部分系统权限限制会导致keyboard库无法读取全局按键输入
- 可以把退出快捷键替换为组合键避免误触,比如改为
ctrl+alt+q,只需将判断条件修改为if keyboard.is_pressed("ctrl+alt+q"):即可
内容的提问来源于stack exchange,提问作者Mr Z
相关产品推荐
相关产品推荐

