使用 Python 3.7.3,如何禁用 Tkinter 的后台 "Tab" 键绑定
Using Python 3.7.3, how do I disable Tkinter's background "Tab" key binding
我正在尝试拦截 Tab 字符按下而不是在根或框架级别明确绑定它,因为这会增加超出预期的复杂性。
我真的不想将一个简单的处理程序绑定到每个按钮。
我想知道两件事:
- 如何intercept/disable后台"Tab"按键绑定?
- Space 栏在选项卡化后触发与该按钮关联的命令(即使您在当前选项卡化的不同小部件上手动调用 widget.focus_set()):我如何防止这种情况?
出于某种原因,Tkinter 处理 Tab 键以自动前进到下一个对象。在我的情况下我不想要这个。基于这个我也试过"return 'break'"但是好像不行,或者后台绑定后出现“_get_key”事件处理
class testFocus:
btns = { }
string = ''
NumberCharList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'period', 'comma', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def __init__(self, root):
self.top = root
self.top.bind('<Key>', self._get_key)
self.frame = tk.Frame(self.top)
self.frame.pack()
self.var = tk.StringVar(value='Type: ')
self.lbl = tk.Label(self.frame, textvariable=self.var)
self.lbl.pack()
for i in range(15):
self.btns[i] = tk.Button(self.frame, text=f'Click {i}', command=lambda x=i: print(x))
self.btns[i].pack()
def _get_key(self, event):
print('Root._get_key.event.keysym: ', event.keysym)
print(root.focus_get())
if event.keysym in self.NumberCharList:
self.string += event.keysym
self.var.set(self.string)
elif event.keysym == 'Tab':
print('TAB!') # NOT WORKING...WHY?
elif event.keysym == 'Delete':
self.string = ''
self.var.set(self.string)
elif event.keysym == 'BackSpace':
self.string = self.string[:-1]
self.var.set(self.string)
# ... other code that handles specific key presses.
print(root.focus_get())
if __name__ == '__main__':
root = tk.Tk()
root.geometry(f"800x480+{int(root.winfo_screenwidth() / 8)}+{int(root.winfo_screenheight() / 6)}")
root.attributes('-fullscreen', False)
root.title('Tests')
root.resizable(width=False, height=False)
app = testFocus(root)
root.mainloop()
标签输出:
Root._get_key.event.keysym: Tab
.
.
Root._get_key.event.keysym: Tab
.!frame.!button
.!frame.!button
Root._get_key.event.keysym: Tab
.!frame.!button2
.!frame.!button2
Root._get_key.event.keysym: Tab
.!frame.!button3
.!frame.!button3
Root._get_key.event.keysym: Tab
.!frame.!button7
.!frame.!button7
Root._get_key.event.keysym: Tab
.!frame.!button8
.!frame.!button8
Root._get_key.event.keysym: Tab
.!frame.!button9
.!frame.!button9
Root._get_key.event.keysym: Tab
.!frame.!button10
.!frame.!button10
Root._get_key.event.keysym: Tab
.!frame.!button12
.!frame.!button12
How do I intercept/disable the background "Tab" key binding?
默认选项卡行为基于对 "all"
绑定标签的绑定。您可以删除该绑定以删除默认的选项卡行为。
root.unbind_all("<Tab>")
根据您的 python 使用的 tk 的底层版本,它可能使用绑定到 <<NextWindow>>
而不是直接在 Tab 键上。在这种情况下,您需要以类似的方式取消绑定虚拟事件 <<NextWindow>>
:
root.unbind_all("<<NextWindow>>")
如果您想要删除下一个 window 的跳格行为,您可能也想为上一个 window 删除它。该绑定用于虚拟事件 <<PrevWindow>>
root.unbind_all("<<PrevWindow>>")
The Space Bar triggers the command associated with that button after tabbed (even if you manually call widget.focus_set() on a different widget that the current tabbed one): how do I prevent this?
那绝对不会发生。 space 键只有在有焦点时才能触发按钮,或者您已明确设置自己的绑定来处理其他小部件中的 space 键。
我正在尝试拦截 Tab 字符按下而不是在根或框架级别明确绑定它,因为这会增加超出预期的复杂性。 我真的不想将一个简单的处理程序绑定到每个按钮。
我想知道两件事:
- 如何intercept/disable后台"Tab"按键绑定?
- Space 栏在选项卡化后触发与该按钮关联的命令(即使您在当前选项卡化的不同小部件上手动调用 widget.focus_set()):我如何防止这种情况?
出于某种原因,Tkinter 处理 Tab 键以自动前进到下一个对象。在我的情况下我不想要这个。基于这个
class testFocus:
btns = { }
string = ''
NumberCharList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'period', 'comma', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def __init__(self, root):
self.top = root
self.top.bind('<Key>', self._get_key)
self.frame = tk.Frame(self.top)
self.frame.pack()
self.var = tk.StringVar(value='Type: ')
self.lbl = tk.Label(self.frame, textvariable=self.var)
self.lbl.pack()
for i in range(15):
self.btns[i] = tk.Button(self.frame, text=f'Click {i}', command=lambda x=i: print(x))
self.btns[i].pack()
def _get_key(self, event):
print('Root._get_key.event.keysym: ', event.keysym)
print(root.focus_get())
if event.keysym in self.NumberCharList:
self.string += event.keysym
self.var.set(self.string)
elif event.keysym == 'Tab':
print('TAB!') # NOT WORKING...WHY?
elif event.keysym == 'Delete':
self.string = ''
self.var.set(self.string)
elif event.keysym == 'BackSpace':
self.string = self.string[:-1]
self.var.set(self.string)
# ... other code that handles specific key presses.
print(root.focus_get())
if __name__ == '__main__':
root = tk.Tk()
root.geometry(f"800x480+{int(root.winfo_screenwidth() / 8)}+{int(root.winfo_screenheight() / 6)}")
root.attributes('-fullscreen', False)
root.title('Tests')
root.resizable(width=False, height=False)
app = testFocus(root)
root.mainloop()
标签输出:
Root._get_key.event.keysym: Tab
.
.
Root._get_key.event.keysym: Tab
.!frame.!button
.!frame.!button
Root._get_key.event.keysym: Tab
.!frame.!button2
.!frame.!button2
Root._get_key.event.keysym: Tab
.!frame.!button3
.!frame.!button3
Root._get_key.event.keysym: Tab
.!frame.!button7
.!frame.!button7
Root._get_key.event.keysym: Tab
.!frame.!button8
.!frame.!button8
Root._get_key.event.keysym: Tab
.!frame.!button9
.!frame.!button9
Root._get_key.event.keysym: Tab
.!frame.!button10
.!frame.!button10
Root._get_key.event.keysym: Tab
.!frame.!button12
.!frame.!button12
How do I intercept/disable the background "Tab" key binding?
默认选项卡行为基于对 "all"
绑定标签的绑定。您可以删除该绑定以删除默认的选项卡行为。
root.unbind_all("<Tab>")
根据您的 python 使用的 tk 的底层版本,它可能使用绑定到 <<NextWindow>>
而不是直接在 Tab 键上。在这种情况下,您需要以类似的方式取消绑定虚拟事件 <<NextWindow>>
:
root.unbind_all("<<NextWindow>>")
如果您想要删除下一个 window 的跳格行为,您可能也想为上一个 window 删除它。该绑定用于虚拟事件 <<PrevWindow>>
root.unbind_all("<<PrevWindow>>")
The Space Bar triggers the command associated with that button after tabbed (even if you manually call widget.focus_set() on a different widget that the current tabbed one): how do I prevent this?
那绝对不会发生。 space 键只有在有焦点时才能触发按钮,或者您已明确设置自己的绑定来处理其他小部件中的 space 键。