Я пытаюсь создать раскладку клавиатуры , чтобы моя клавиатура не использовала Microsoft бесполезно IME keyboard. Итак, я написал этот код python с pynput.

Но похоже, что он не выполняет мою функцию execute()

   from pynput.keyboard import Key, Controller
   
   current = set()
   keyboard_typ = Controller()
   
   COMBINATIONS = [
   
       {keyboard.KeyCode(char="q")},
       {keyboard.KeyCode(char="Q")},
       {keyboard.KeyCode(char="w")},
       {keyboard.KeyCode(char="W")},
       {keyboard.KeyCode(char="e")},
       {keyboard.KeyCode(char="E")},
       {keyboard.KeyCode(char="r")},
       {keyboard.KeyCode(char="R")},
       {keyboard.KeyCode(char="t")},
       {keyboard.KeyCode(char="T")},
       {keyboard.KeyCode(char="y")},
       {keyboard.KeyCode(char="Y")},
       {keyboard.KeyCode(char="u")},
       {keyboard.KeyCode(char="U")},
       {keyboard.KeyCode(char="i")},
       {keyboard.KeyCode(char="I")},
       {keyboard.KeyCode(char="o")},
       {keyboard.KeyCode(char="O")},
       {keyboard.KeyCode(char="p")},
       {keyboard.KeyCode(char="P")},
       {keyboard.KeyCode(char="a")},
       {keyboard.KeyCode(char="A")},
       {keyboard.KeyCode(char="s")},
       {keyboard.KeyCode(char="S")},
       {keyboard.KeyCode(char="d")},
       {keyboard.KeyCode(char="D")},
       {keyboard.KeyCode(char="f")},
       {keyboard.KeyCode(char="F")},
       {keyboard.KeyCode(char="g")},
       {keyboard.KeyCode(char="G")},
       {keyboard.KeyCode(char="h")},
       {keyboard.KeyCode(char="H")},
       {keyboard.KeyCode(char="j")},
       {keyboard.KeyCode(char="J")},
       {keyboard.KeyCode(char="k")},
       {keyboard.KeyCode(char="K")},
       {keyboard.KeyCode(char="l")},
       {keyboard.KeyCode(char="L")},
       {keyboard.KeyCode(char="z")},
       {keyboard.KeyCode(char="Z")},
       {keyboard.KeyCode(char="x")},
       {keyboard.KeyCode(char="X")},
       {keyboard.KeyCode(char="c")},
       {keyboard.KeyCode(char="C")},
       {keyboard.KeyCode(char="v")},
       {keyboard.KeyCode(char="V")},
       {keyboard.KeyCode(char="b")},
       {keyboard.KeyCode(char="B")},
       {keyboard.KeyCode(char="n")},
       {keyboard.KeyCode(char="N")},
       {keyboard.KeyCode(char="m")},
       {keyboard.KeyCode(char="M")},
   
   ]
   
   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 execute() :
   
       if current == "q":
           
           print("q")
       
   
   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() 
0
Arib.Glitch 15 Фев 2021 в 15:07

3 ответа

Лучший ответ

Execute () имеет current, но вы никогда не передаете такую ​​переменную функции, поэтому вы ничего не сравниваете. Ваша функция должна выглядеть так

   def execute(current) :
   
       if current == "q":
           
           print("q")
0
Joaquín 15 Фев 2021 в 12:12

Поразмыслив над теорией "установки струн" Хоакина, я преобразовал свой set в string и это сработало.

Спасибо, Хоакин.

  def execute(current_key) :
   
      s = str(current_key)
   
      for i in s :
          
           if i == "q" :
           
              print("q")
1
Arib.Glitch 15 Фев 2021 в 13:00

Если вы передадите current функции, все клавиши будут нажаты сейчас и будет использоваться цикл или условие if для проверки клавиши в нажатых клавишах. или просто передайте key, если вам нужна только последняя нажатая клавиша.

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(current)

def execute(current_key_set) :
   for key in current_key_set:
      print(key)

Или

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(key)

def execute(current_key) :
   print(current_key)
0
Prudhvi 15 Фев 2021 в 12:40
66207763