如何停止/解绑pynput监听器?快捷键退出程序失效问题解决
修复翻译器快捷键退出无效的问题
问题出在exit()无法正确终止主线程——因为listener.join()会阻塞主线程,而on_exit_hotkey是在监听器的子线程中执行的,内置的exit()只会终止当前子线程,主线程仍会卡在join()处。
修复方案
改用sys.exit()替代exit(),它会向主线程抛出SystemExit异常,打破join()的阻塞状态,让程序正常退出。同时建议加入异常捕获,处理手动中断的情况。
修改后的完整代码:
import sys import keyboard def on_translate_hotkey(): # 此处替换为你的翻译逻辑 print("已触发翻译") def on_exit_hotkey(): listener.stop() sys.exit() print('\n-- 按下 CTRL+T 触发翻译') print('-- 按下 SHIFT+ESC 退出程序\n') listener = keyboard.GlobalHotKeys({'<ctrl>+t': on_translate_hotkey, '<shift>+<esc>': on_exit_hotkey}) listener.start() try: listener.join() except KeyboardInterrupt: listener.stop()
另一种可选方案
如果不想依赖join()的阻塞,也可以用循环保持主线程活跃,避免子线程退出后主线程仍卡住:
import sys import keyboard import time def on_translate_hotkey(): print("已触发翻译") def on_exit_hotkey(): listener.stop() sys.exit() print('\n-- 按下 CTRL+T 触发翻译') print('-- 按下 SHIFT+ESC 退出程序\n') listener = keyboard.GlobalHotKeys({'<ctrl>+t': on_translate_hotkey, '<shift>+<esc>': on_exit_hotkey}) listener.start() while True: try: time.sleep(0.5) # 短暂休眠降低CPU占用 except KeyboardInterrupt: listener.stop() break
内容的提问来源于stack exchange,提问作者Dany
相关产品推荐
相关产品推荐

