Python Tkinter如何区分<;键>;及<;控制键>;绑定?

Python Tkinter如何区分<;键>;及<;控制键>;绑定?,python,windows,tkinter,Python,Windows,Tkinter,这可能是一个简单的答案 我有一个文本小部件,我想将任何字母数字键盘键(a-zA-Z0-9_u和其他常规键)绑定到一个特定的方法,并将Ctrl+F绑定到另一个方法 使用widget.bind(“,method)将创建以下内容: 单击Ctrl+F将调用方法两次,一次用于Ctrl(event.keysym=Control,event.char=None),第二次用于F(event.keysym=F,event.char=) 单击F将调用方法(event.keysym=F,event.char=F) 有

这可能是一个简单的答案

我有一个文本小部件,我想将任何字母数字键盘键(a-zA-Z0-9_u和其他常规键)绑定到一个特定的方法,并将Ctrl+F绑定到另一个方法

使用
widget.bind(“,method)
将创建以下内容:

  • 单击Ctrl+F将调用
    方法两次,一次用于Ctrl(
    event.keysym=Control,event.char=None
    ),第二次用于F(
    event.keysym=F,event.char=
  • 单击F将调用
    方法(
    event.keysym=F,event.char=F
  • 有办法区分这两种情况吗?

    您可以绑定
    (其他键也是如此)

    您可以绑定
    (其他键也是如此)


    请创建一个您可以手动(或在
    for
    循环中)设置
    等。请创建一个您可以手动(或在
    for
    循环中)的设置
    等。我将
    event.state==20
    更改为
    event.state&4
    以使用其他特殊键:我将
    event.state==20
    更改为
    event.state&4
    以使用其他特殊键:
    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()
    
    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()