我一直在寻找一种在tkinter应用程序中设置Tab键顺序的方法,我一直在努力。目前默认顺序似乎是从上到下,但它需要使用 CTRL + Tab 来循环控制。
有没有办法自定义订单,更重要的是,将 CTRL + 标签改为Tab?
答案 0 :(得分:13)
Tab键顺序基于堆叠顺序,而堆叠顺序又默认为创建小部件的顺序。您可以使用tkraise
(或lift
)和lower
方法调整堆叠顺序(以及标签顺序)。
这应该是开箱即用的,无需按 CTRL + Tab 。但请注意,该选项卡会在文本小部件中插入文字选项卡,而不是将焦点移动到另一个控件。当然可以改变默认行为。
以下是显示如何撤消Tab键顺序的示例。运行示例时,按第一个条目中的tab键可以将您带到最后一个。再次按下标签会转到第二个,然后是第一个,起泡,冲洗,重复
请注意,原生Tk
命令为raise
和lower
,但由于raise
是Python中的保留字,因此必须在tkinter中重命名。
import Tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
e1 = tk.Entry(self)
e2 = tk.Entry(self)
e3 = tk.Entry(self)
e1.insert(0,"1")
e2.insert(0,"2")
e3.insert(0,"3")
e1.pack()
e2.pack()
e3.pack()
# reverse the stacking order to show how
# it affects tab order
new_order = (e3, e2, e1)
for widget in new_order:
widget.lift()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
由于你提到你必须做 CTRL + Tab ,我猜你正试图让tab键从文本小部件改变焦点。通常,Tab键会插入文字选项卡。如果您希望它更改焦点,只需添加绑定到<Tab>
事件。
Tkinter有一个函数,它将返回应该获得焦点的下一个小部件的名称。不幸的是,对于旧版本的Tkinter来说,这个功能是错误的。但是,解决这个问题很容易。以下是您可以添加到上述代码中的几种方法:
def _focusNext(self, widget):
'''Return the next widget in tab order'''
widget = self.tk.call('tk_focusNext', widget._w)
if not widget: return None
return self.nametowidget(widget.string)
def OnTextTab(self, event):
'''Move focus to next widget'''
widget = event.widget
next = self._focusNext(widget)
next.focus()
return "break"