Порядок табуляции основан на порядке наложения, который в свою очередь по умолчанию соответствует порядку создания виджетов. Вы можете настроить порядок наложения (и, следовательно, порядок табуляции), используя методы 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>
.
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"