2017-06-08 21 views
0

pynputを使用してキーボードリスナーに慣れる簡単なプログラムがあります。それは重要ではありません。重要なことは、shift_pressed属性がTrueに変更されないように見えることです。私のプログラムは現在、次のようになります。pynputキーボードリスナーは、シフトが押されたときにshiftを返しますが、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) 

私はon_press(またはon_release)にこのような何かをしようとしている:

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

     else: 
      func2() 

それならば、このコードはfunc1シフトが押されているかfunc2を実行する必要がありますそうではありません。しかし、shift_pressedは永久に間違っているので、現在のところfunc2しか行っていません。 shift_pressedを正常に動作させるにはどうしたらよいですか?

編集1:目的の最終結果をより明確に指定します。

編集2:追加する文字列を2つの異なる機能に変更して、より明瞭にする。

編集3:もっと最近の例に一致するように最後の質問のパラメータを変更し

答えて

0

これはpynput 1.3.5ドキュメントのバグです。

種々の修飾状態特性(alt_pressedalt_gr_pressedctrl_pressedshift_pressed)はControllerインスタンスの状態のみを反映します。さまざまなキーが押されたときに適用される内部修飾子の状態を維持します。たとえば、それをサポートするスクリプトの大文字に適用されます。

この状態は現在のオペレーティングシステムの状態とは異なり、特定のコントローラを使用してキーを押すと変更されます。

現行のグローバル修飾子状態を取得するための一般的なpynputメソッドはありません。

+0

githubリポジトリに問題を投稿した後、私は[このクローズドな問題](https://github.com/moses-palmer/pynput/issues/20)を見ました。私はここで私の目的のためにあなたが使用したパターンを使用します。ご協力ありがとうございました。 –

0

私はない百パーセント確信しているが、私はpynputで働いていたとき、私は、私は、キーのリリースでアクションを処理できることではない気づきましたキーを押して、あなたは以下のようなものを試すことができるように:あなたは、他のが必要な場合

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

は私はあなたの特定の動機を知っているのに役立ちます。

+0

Shiftキーを押しているだけです。 'if key == Key.shift:do_something'を実行すると、他のキーのアクションを変更できるように使用しようとしているshift_pressed属性が変更されていないという問題が発生します。 –

+0

@Ericチェックする。そんなことが欲しいですか?文字が文字列 'と一致する場合、key.char == 'A':'を実行して、目的の操作を実行できます。 – Gahan

+0

少し明確にするために質問を修正します。 –

関連する問題