Как запустить бесконечный цикл while и keyboard.Listener из библиотеки pynput одновременно? - PullRequest
0 голосов
/ 04 ноября 2018

Я написал этот бесконечный цикл while и хочу остановить его после сочетаний клавиш.

import webbrowser
import time
import random

def visitweb():
  global done
  done = False
  while not done:
     sites = ['google.com', 'test.com', 'quora.com', 'anything.com']
     sites = random.choice(sites)
     visit = f"http://www.{sites}"
     webbrowser.open(visit)
     seconds = random.randrange(5, 20)
     time.sleep(seconds)

Итак, я хочу, чтобы цикл while выполнялся до тех пор, пока на клавиатуре не будет нажата определенная комбинация клавиш, конечно же, за пределами терминала. Я не хочу использовать ввод, чтобы остановить его или убить скрипт, я знаю, как это сделать, используя msvcrt.

Я считаю, что это можно сделать с помощью библиотеки pynput, я уже смог найти способ выполнить задачу после нажатия клавиши, используя pynput.keyboard.Listener.

Как это:

from pynput import keyboard

combinations = [
   {keyboard.Key.shift, keyboard.KeyCode(char='a')},
   {keyboard.Key.shift, keyboard.KeyCode(char='A')}
]

current = set()

  def execute():
      global done
      done = True
      print(f"this is done")

  def on_press(Key):
      if any([Key in COMBO for COMBO in combinations]):
          current.add(Key)
          if any(all(k in current for k in COMBO) for COMBO in combinations):
              execute()

  def on_release(Key):
      if any([Key in COMBO for COMBO in combinations]):
          current.remove(Key)

  with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
       listener.join()

Теперь, как я могу заставить эти два сценария работать вместе? Как сделать так, чтобы цикл while работал в то же время , что и keyboard.Listener. В настоящее время после нажатия shift + a цикл while обрывается.

PS: это для учебных целей.

...