如何通过快捷键停止Python keyboard库开发的键盘连发工具而无需关闭程序
实现方案
现有代码的核心问题是连发逻辑进入阻塞式死循环后,没有额外的事件监听机制响应终止快捷键,同时长时长的time.sleep()会阻塞快捷键事件的响应。以下是可直接运行的修改方案:
修改后完整代码
import keyboard import time # 全局状态标志:控制连发是否运行 is_running = False # 可自定义快捷键,这里设F9启动,F10终止 START_HOTKEY = "f9" STOP_HOTKEY = "f10" def start_spam(): global is_running if not is_running: is_running = True print("连发已启动") def stop_spam(): global is_running if is_running: is_running = False print("连发已停止") # 注册热键 keyboard.add_hotkey(START_HOTKEY, start_spam) keyboard.add_hotkey(STOP_HOTKEY, stop_spam) # 可选:注册esc为退出程序快捷键 keyboard.add_hotkey("esc", lambda: keyboard.unhook_all() or exit()) print(f"按{START_HOTKEY}启动连发,按{STOP_HOTKEY}停止连发,按esc退出程序") # 主循环 while True: # 只有状态为运行时才执行连发逻辑 if is_running: for i in range(9): # 每次循环都判断状态,避免中途触发停止没响应 if not is_running: break keyboard.send("ctrl+v,enter") # 把0.4秒的sleep拆成4次0.1秒的sleep,每段都检查状态,响应更及时 for _ in range(4): if not is_running: break time.sleep(0.1) # 空闲状态降低CPU占用 time.sleep(0.05)
核心逻辑说明
- 用全局布尔变量
is_running作为连发运行的开关,热键触发时仅修改这个变量的状态,不需要中断程序进程 - 热键监听是
keyboard库的独立事件线程,不会被主循环的逻辑阻塞,任何时候按下终止快捷键都会立刻修改状态 - 把长时长的
time.sleep()拆分为多段短时长休眠,每段休眠前都检查运行状态,保证终止请求的响应延迟不超过0.1秒 - 不需要关闭程序即可反复启停连发,按esc才会完全退出程序
内容的提问来源于stack exchange,提问作者SomethinkBlooc
相关产品推荐
相关产品推荐

