在Python 3.x中无需按回车,用字符终止运行程序的问题
问题解决:无法通过按键终止循环程序
问题根源
你的代码存在两个关键问题导致无法终止循环:
- 按键判断逻辑错误:pynput捕获的字符键对象
key,其字符串形式是KeyCode(char='x'),而非你判断的"'x'",所以条件永远不成立。 - 线程终止逻辑无效:
sys.exit()在listener子线程中调用时,只会终止当前子线程,主线程的while True循环不受影响。
修正后的代码
from pynput import keyboard from time import sleep import threading # 创建线程安全的终止信号 stop_event = threading.Event() def run_program(): while not stop_event.is_set(): print('Program is running now... press \'x\' to stop') sleep(1) print('Program stopped.') def on_press(key): try: if key.char == 'x': stop_event.set() # 设置终止信号 return False # 停止listener线程 except AttributeError: # 处理非字符按键(如功能键) pass # 启动监听器 listener = keyboard.Listener(on_press=on_press) listener.start() # 运行主程序 run_program() # 等待监听器线程结束 listener.join()
修改说明
- 使用
threading.Event作为线程安全的终止标记,主线程循环会持续检查这个标记的状态 - 直接通过
key.char判断按键字符,避免字符串匹配的错误 - 设置终止信号后返回
False,主动停止listener线程,避免资源浪费 - 最后调用
listener.join()确保监听器线程正常退出
内容的提问来源于stack exchange,提问作者bryxjam
相关产品推荐
相关产品推荐

