繁体   English   中英

Tkinter 如何绑定到 shift+tab

[英]Tkinter how to bind to shift+tab

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

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

文件“/usr/lib64/python3.8/tkinter/init .py”,第 1337 行,在_bind self.tk.call(what + (sequence, cmd)) _tkinter.TclError: bad event type or keysym "Shift_Tab"


更新

我仍然在检测SHIFT + TAB时遇到问题。 这是我的测试代码。 我的操作系统是 Linux。 tab键有效,而不是SHIFT + TAB 似乎是一个简单的问题要解决,所以我一定是做错了?

我正在尝试在Treeview中的列之间进行制表符,我在一行上覆盖了小部件以模拟内联编辑。 一行中只能有一个活动小部件。 我跟踪我所在的列,当用户按下SHIFT + TABTAB时,我删除当前小部件并在相应列中显示一个新小部件。

这是完整项目的链接

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

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

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

下面的代码(在 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()

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

'<Control-ISO_Left_Tab>'.

不是直接的答案,评论太长了。

您可以通过一个简单的技巧自己解决您的问题,将<Key>绑定到 function,并打印传递给bind function 的键事件参数,您可以在其中查看哪个键被按下或未按下。 尝试多种键组合,看看state是什么以及它们的键keysymkeycode是什么。

import tkinter as tk

def key_press(evt):
    print(evt)

root = tk.Tk()
root.bind("<Key>", key_press)
root.mainloop()

它将 output 在 macOS 上按下SHIFT + TAB组合。

<KeyPress event state=Shift keysym=Tab keycode=3145753 char='\x19' x=-5 y=-50>

在哪里,

  • state=Shift表示键事件的 state 处于SHIFT上。

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

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

  • 此外,请查看所有 事件属性。

虽然 bind '<Shift-Tab>'组合键在 Mac 上效果很好,但也可以像这样使用...

def key_press(evt):
    if evt.keycode==3145753:
        print('Shift+Tab is pressed')

这是我为想要绑定Shift+Tab的 Linux 用户的解决方案。

def press(e):
        print('Shift+Tab is pressed')

widget.bind('<ISO_Left_Tab>',press)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM