首页 > 解决方案 > 为什么在使用 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
...

标签: pythonpython-3.xpynput

解决方案


您应该使用非阻塞线程,并且您的代码应该是:

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)

推荐阅读