python - 为什么在使用 F1 键停止代码后按 Enter 键时此代码不打印 Hi?
问题描述
from pynput import keyboard
import time
break_program = True
def on_press(key):
global break_program
print (key)
if key == keyboard.Key.f1:
print ('end pressed')
break_program = False
return True
elif key == keyboard.Key.enter:
print ('enter pressed')
break_program = True
return True
else:
return True
print("Press 'F1' key to stop the bot.")
print("Press enter to start the bot.")
with keyboard.Listener(on_press=on_press) as listener:
while break_program == True:
print('Hi')
time.sleep(1)
listener.join()
此代码应在按下时停止运行,F1
并应在Enter
按下时运行。
按下Enter
时,它进入elif
状态并打印enter pressed
,但不打印Hi
,因为break_program
分配回True
样本输出:
Press 'F1' key to stop the bot.
Press enter to start the bot.
Hi
Hi
Hi
Hi
Key.f1
end pressed
Key.enter
enter pressed
输出应该如何:
Press 'F1' key to stop the bot.
Press enter to start the bot.
Hi
Hi
Hi
Hi
Key.f1
end pressed
Key.enter
enter pressed
Hi
Hi
...
解决方案
您应该使用非阻塞线程,并且您的代码应该是:
from pynput import keyboard
import time
break_program = True
def on_press(key):
global break_program
print (key)
if key == keyboard.Key.f1 and break_program:
print ('end pressed')
break_program = False
if key == keyboard.Key.enter:
print ('enter pressed')
break_program = True
print("Press 'F1' key to stop the bot.")
print("Press enter to start the bot.")
listener = keyboard.Listener(on_press=on_press)
listener.start()
while True:
if break_program:
print("Hi")
time.sleep(1)
推荐阅读
- javascript - 通过对孩子进行硬编码来验证 azure jwt 令牌中的孩子
- javascript - 我应该如何在javascript中编写代码以通过双击更改元素的颜色?
- c# - 查找面板位于哪个面板阵列中
- sql - 使用其他两个表(如加入条件)更新表?
- flutter - : 我怎样才能改变条带测试生活?
- reactjs - 使用 jest 和 react-testing-library 测试连接的组件
- java - Java Tesseract 改进了从图像中读取文本
- c++ - 如何使用 C++ 中的通用引用参数为模板类编写构造函数
- vim - jedi-vim 如何关闭 __doc__ 窗口并从缓冲区列表中删除?
- java - 如何为不同的 Zookeeper Docker 容器设置不同的管理端口?