Как установить порядок вкладок в приложении tkinter? - PullRequest
6 голосов
/ 14 июля 2011

Я искал способ установить порядок вкладок в приложении tkinter, над которым я работал.В настоящее время порядок по умолчанию, кажется, работает сверху вниз, но для циклического перемещения по элементам управления требуется CTRL + Tab .

Есть ли способ настроитьпорядок и, более того, измените CTRL + Tab на просто Tab?

1 Ответ

15 голосов
/ 21 июля 2011

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