2017-01-24 13 views
0

これは簡単な答えかもしれません。Tkinter <Key>と<Control-Key>バインディングを区別する方法は?

私は別の方法に+ F私は特定のメソッドに任意の英数字キーボードのキー(-ZA-Z0-9_と定期的なキーの残りの部分)に結合するテキストウィジェットを持っている、とCtrlキー。

次が作成されますwidget.bind("<Key>", method)を使用する:ため

  1. クリックCtrlキー + F二回methodを呼び出します、1 ためにはCtrlevent.keysym = Control_L, event.char = None)と第二(event.keysym = f, event.char = <invalid>
  2. FFをクリックすると、methodevent.keysym = f, event.char = f)が呼び出されます。

2つのシナリオを区別する方法はありますか?

+2

[、最小限の完全かつ検証可能な例]を作成してくださいは、(のhttp:// –

+0

手動で(または 'for'ループで)' 'と' 'などを設定できます。 – furas

答えて

3

<Control-f><f>(他のキーと同じ)をバインドすることができます。

import tkinter as tk 

# --- functions --- 

def key_f(event): 
    print('key: f') 

def key_shift_f(event): 
    print('key: Shift + f') 

def key_control_f(event): 
    print('key: Control + f') 

def key_control_shift_f(event): 
    print('key: Control+Shift + f') 

# --- main --- 

root = tk.Tk() 

#root.bind("<f>", key_f) # it works too 
#root.bind("<F>", key_shift_f) # it works too 
root.bind("f", key_f) 
root.bind("F", key_shift_f) 
root.bind("<Control-f>", key_control_f) 
root.bind("<Control-F>", key_control_shift_f) 

root.mainloop() 

それともControlでキーを認識するためにevent.state & 4を使用することができます。それは他の特殊キー

に関する情報を保持しますので、あなたは、ビット単位の&必要

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/event-handlers.htmlMasks/Modifierを参照)

import tkinter as tk 

# --- functions --- 

def method(event): 
    print('-----') 
    print('[DEBUG] event.char :', event.char) 
    print('[DEBUG] event.keysym:', event.keysym) 
    print('[DEBUG] event.state :', event.state, '=', bin(event.state)) 

    if event.char: # skip Control_L, etc. 

     # if you need `& 5` then it has to be before `& 4` 

     if event.state & 5 == 5: # it needs `== 5` because `& 5` can give results `5`, `4` or `1` which give `True` or `0` which gives `False` 
      print('method: Control+Shift +', event.keysym) 

     elif event.state & 4: # it doesn't need `== 4` because `& 4` can give only results `4` or `0` 
      print('method: Control +', event.keysym) 

     elif event.state & 1: # it doesn't need `== 1` because `& 1` can give only results `1` or `0` 
      print('method: Shift +', event.keysym) 

     else: 
      print('method:', event.keysym) 

# --- main --- 

root = tk.Tk() 

root.bind("<Key>", method) 

root.mainloop() 
+0

'event.state == 20'を' event.state&4'に変更して、他の特別なキーで動作させました: – furas

関連する問題