Tkinter 如何绑定到 shift+tab

Dan*_*son 7 python keyboard-shortcuts tkinter key-bindings python-3.x

我正在尝试绑定SHIFT+TAB键,但我似乎无法让它工作。我绑定到的Entry小部件是一个小部件。

我试过用 绑定键widget.bind('<Shift_Tab>', func),但我收到一条错误消息:

文件“/usr/lib64/python3.8/tkinter/初始化的.py”,行1337,在_bind self.tk.call(什么+(序列,CMD))_tkinter.TclError:不良事件类型或键符“Shift_Tab”


更新

我仍然在检测SHIFT+ 时遇到问题TAB。这是我的测试代码。我的操作系统是 Linux。tab重点工作,只是没有SHIFT+ TAB。似乎要解决一个简单的问题,所以我一定是错的?

我试图在Treeview我在一行上覆盖小部件以模拟内联编辑的列之间切换。一行中只能有一个活动小部件。我会跟踪我所在的列以及当用户按下SHIFT+TAB或 时TAB,我会删除当前的小部件并在相应的列中显示一个新的小部件。

这是完整项目的链接

该项目在一个文件中,没有导入。

下面的代码是我的尝试,它不起作用。

import tkinter as tk
import tkinter.ttk as ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.title('Default Demo')
        self.geometry('420x200')

        wdg = ttk.Entry(self)
        wdg.grid()

        def tab(_):
            print('Tab pressed.')

        def shift_tab(_):
            print('Shift tab pressed.')

        wdg.bind('<Tab>', tab)
        wdg.bind('<Control-ISO_Left_Tab>', shift_tab)


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

Enr*_*alo 6

下面的代码(在 python 2.7.6 中)应该可以清楚地说明:我希望这个参考对你有用

from Tkinter import *

def key(event=None):
    print 'You pressed Ctrl+Shift+Tab'

root = Tk()

frame = Frame(root, width=100, height=100)
frame.focus_set()
frame.bind('<Control-Shift-KeyPress-Tab>', key)
frame.pack()

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

编辑:以上内容适用于 Windows 和 Mac。对于 Linux,请使用

'<Control-ISO_Left_Tab>'.
Run Code Online (Sandbox Code Playgroud)

  • from Tkinter import * defproof(event=None): print 'ping' root = Tk()frame = Frame(root, height=100, width=100)frame.focus_set()frame.bind('&lt;Control-Shift- KeyPress-U&gt;', 证明)frame.pack() root.mainloop() (2认同)

Saa*_*aad 5

不是直接答案,而且评论太长。

您可以用一个简单的技巧自己解决您的问题,绑定<Key>到一个函数,然后打印传递给该函数的按键事件参数bind,您可以在其中看到哪个键被按下或没有按下。尝试多种按键组合,看看什么是state,什么是它们的keysymkeycode

import tkinter as tk

def key_press(evt):
    print(evt)

root = tk.Tk()
root.bind("<Key>", key_press)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

SHIFT在 macOS 上按+组合键将输出以下内容TAB

<KeyPress event state=Shift keysym=Tab keycode=3145753 char='\x19' x=-5 y=-50>
Run Code Online (Sandbox Code Playgroud)

在哪里,

  • state=Shift表示关键事件的状态为 on SHIFT

  • keysym=Tab表示 Tab 键被按下。如果我们只按SHIFT,则将keysym是 Shift_L 或 Shift_R (在 mac 上显示两个 Shift 键的 Shift_L )。

  • keycode是每个键的唯一代码,即使对于不同的组合键也是如此,例如Left Shift的键码是 ,is131330的键码,但是当按下+时,代码与其中任何一个都不相同,它是。(我不确定这些代码是否适用于每个操作系统,但可以通过将它们打印到控制台来弄清楚)TAB3145737SHIFTTAB3145753

  • 另请参阅所有事件属性。

虽然绑定'<Shift-Tab>'组合键在 Mac 上运行良好,但也可以像这样使用......

def key_press(evt):
    if evt.keycode==3145753:
        print('Shift+Tab is pressed')
Run Code Online (Sandbox Code Playgroud)