Вы пытаетесь сделать две вещи одновременно:
- Прослушайте ввод с клавиатуры
- Делайте все, что
doit()
должен делать.
Следующая программа запускает doit()
в отдельном потоке и, таким образом, позволяет основному потоку продолжать прослушивание нажатий клавиш.
from pynput.keyboard import Key, Listener
from threading import Thread
import time
flag = False
thread = None
def doit():
while flag:
print("test")
time.sleep(0.5)
def released(key):
global flag, thread
if key == Key.up:
flag = True
thread = Thread(target = doit)
thread.start()
elif key == Key.down:
print("stopped")
flag = False
if thread.is_alive():
thread.join()
with Listener(on_release=released) as listener:
listener.join()
thread.start()
не блокирует выполнение, как doit()
.Только при вызове thread.join()
блок основного потока будет блокироваться, пока поток не будет завершен.Обратите внимание, что это зависит от установки основного потока flag = False
, и без этого поток может продолжаться бесконечно, и, следовательно, основной поток будет ждать вечно при вызове thread.join()
.Существует ряд подобных проблем, возникающих при входе в мир многопоточности.