Прослушивание двух разных нажатий клавиш в одном методе (Pynput) - PullRequest
0 голосов
/ 22 января 2019

В сущности, моя программа прослушивает нажатия клавиш, и, если она видит нажатой стрелку «вверх», она начинает печатать слово test, используя цикл while, который полагается, что «flag» имеет значение true. Я бы хотел, чтобы программа остановилась при нажатии клавиши «вниз», но я не могу этого сделать. Я не получаю никаких ошибок, это просто не останавливается.

Вот код:

from pynput.keyboard import Key, Listener

flag = False

def doit():
    while flag:
        print("test")


def released(key):
    global flag
    if key == Key.up:
        flag = True
        doit()
    elif key == Key.down:
        print("stopped")
        flag = False


with Listener(on_release=released) as listener:
    listener.join()

Когда я нажимаю стрелку вниз, «стоп» не печатается, поэтому кажется, что оператор if вообще не используется. Как я могу это исправить?

1 Ответ

0 голосов
/ 23 января 2019

Вы пытаетесь сделать две вещи одновременно:

  1. Прослушайте ввод с клавиатуры
  2. Делайте все, что 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().Существует ряд подобных проблем, возникающих при входе в мир многопоточности.

...