[英]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 + 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()
下面的代码(在 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
是什么以及它们的键keysym
或keycode
是什么。
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 是131330
, TAB的 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.