如何在不使用while循环的情况下获取键盘输入?
解决keyboard模块阻塞主线程的问题
直接用keyboard.read_event()配合while循环确实会卡死主线程——这个方法是同步阻塞式的,程序会一直停在等待按键输入的步骤上,没法执行其他逻辑。这里给你两种常用的非阻塞解决方案:
方案1:使用回调函数
利用keyboard.on_press()注册按键触发的回调函数,不用自己写循环,按键事件触发时自动执行逻辑,主线程可以正常处理其他任务:
import keyboard def handle_key_press(event): print(f"按下了按键:{event.name}") # 注册按键按下的回调 keyboard.on_press(handle_key_press) # 主线程可以继续执行其他操作,这里用input保持程序运行(根据实际需求替换) input("按任意键结束程序\n")
方案2:使用子线程
把阻塞的按键监听逻辑放到子线程中,让主线程和监听线程并行运行:
import keyboard import threading import time def key_listener(): while True: event = keyboard.read_event() if event.event_type == keyboard.KEY_DOWN: print(f"按下了按键:{event.name}") # 启动守护线程,主线程结束时自动退出 listener_thread = threading.Thread(target=key_listener, daemon=True) listener_thread.start() # 主线程正常执行业务逻辑,这里模拟持续运行的任务 while True: print("主线程正在处理其他任务...") time.sleep(1)
两种方案各有适用场景:回调方式代码更简洁,适合简单的按键响应需求;线程方式灵活性更高,适合需要在监听逻辑里处理复杂流程的场景。
内容的提问来源于stack exchange,提问作者anothanothaone
相关产品推荐
相关产品推荐

