2017-06-08 1 views
0

Ich habe ein einfaches Programm, um mich mit Tastatur-Listenern vertraut zu machen, die pynput verwenden. Was es macht, ist nicht wichtig. Wichtig ist, dass das shift_pressed Attribut nie zu True zu ändern scheint. Mein Programm sieht derzeit wie folgt aus:pynput Tastatur-Listener gibt die Verschiebung zurück, wenn shift gedrückt wird, ändert aber nicht shift_pressed

from pynput.keyboard import Controller, Listener 

boo = True 
keyboard = Controller() 

fib_lst = [0, 1] 


def on_press(key): 
    print(key) 
    print(keyboard.shift_pressed) 


Listener(on_press=on_press).start() 

while boo: 
    nxt = fib_lst[-1] + fib_lst[-2] 
    input(nxt) 
    fib_lst.append(nxt) 

Ich versuche, so etwas wie dies in on_press (oder on_release) zu tun:

def on_press(key): 
    if key == Key.delete: 
     if keyboard.shift_pressed: 
      func1() 

     else: 
      func2() 

Dieser Code sollte func1 durchführen, wenn Verschiebung gedrückt wird oder wenn es func2 ist nicht. Aber es ist derzeit nur func2 seit shift_pressed ist immer falsch. Was kann ich anders machen, um shift_pressed so zu funktionieren, wie es sollte?

Edit 1: Gibt das gewünschte Endergebnis deutlicher an.

Edit 2: Die anhängende Zeichenfolge wurde in zwei verschiedene Funktionen geändert, um mehr Klarheit zu schaffen.

bearbeiten 3: die Parameter der letzten Frage wird geändert neueres Beispiel entsprechen

Antwort

0

Dies ist ein Fehler in der pynput 1.3.5 Dokumentation.

Die verschiedenen Modifikator Zustandseigenschaften (alt_pressed, alt_gr_pressed, ctrl_pressed und shift_pressed) spiegeln nur den Zustand der Controller Instanz; es behält einen inneren Modifikationszustand bei, der angewendet wird, wenn verschiedene Tasten gedrückt werden - zum Beispiel auf Großbuchstaben von Skripten, die sie unterstützen.

Dieser Status unterscheidet sich vom aktuellen Betriebssystemstatus und wird nur dann geändert, wenn Sie Tasten drücken, die diesen bestimmten Controller verwenden.

Es gibt keine allgemeine Methode pynput zum Abrufen des aktuellen globalen Modifikatorstatus.

+0

Nachdem ich das Problem in Ihrem github Repo veröffentlicht hatte, sah ich [dieses geschlossene Problem] (https://github.com/moses-palmer/pynput/issues/20). Ich werde hier das Muster verwenden, das du für meine Zwecke benutzt hast. Danke für Ihre Hilfe. –

0

Ich bin nicht hundertprozentig sicher, aber wenn ich mit pynput habe ich bemerkt, dass ich Aktion auf Schlüsselhilfsentriegelung verarbeiten kann, nicht Taste drücken, so dass Sie so etwas wie unten probieren:

from pynput import keyboard 

def on_press(key): 
    if key == keyboard.Key.shift: # handles if key press is shift 
     print('foo', end='') 

def on_release(key): 
    if key == keyboard.Key.shift: 
     print() 
    elif key == keyboard.Key.delete: 
     print('bar') 
    elif key == keyboard.Key.esc: 
     return False 

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

get_current_key_input() 

wenn Sie irgendeine andere Hilfe benötigen lassen Sie mich mit Ihren spezifischen Motiv kennen.

+0

Es ist der Druck der Shift gerade gut. Wenn ich 'if key == Key.shift: do_something' anlege, wird eine Aktion ausgeführt. Das Problem ist, dass das Attribut shift_pressed nicht geändert wird, was ich versuche, um die Aktionen anderer Schlüssel zu ändern. –

+0

@Eric jetzt überprüfen. Willst du so etwas? Sie können Zeichen mit der Zeichenfolge 'if key.char ==' A ':' abgleichen und die gewünschte Aktion ausführen. – Gahan

+0

Ich werde meine Frage ändern, um ein wenig zu klären. –

Verwandte Themen