Изменение фокуса с одного текстового виджета на другой

Я новичок в Python и пытаюсь создать простой графический интерфейс с использованием Tkinter.

Так часто во многих пользовательских интерфейсах нажатие кнопки табуляции меняет фокус с одного текстового виджета на другой. Всякий раз, когда я нахожусь в текстовом виджете, вкладка только делает отступ для текстового курсора.

Кто-нибудь знает, если это настраивается?

Ответ 1

Это очень легко сделать с Tkinter.

Есть несколько вещей, которые должны произойти, чтобы сделать эту работу. Во-первых, вам нужно убедиться, что стандартное поведение не выполняется. То есть вы не хотите, чтобы вкладка вставляла вкладку и перемещала фокус на следующий виджет. По умолчанию события обрабатываются конкретным виджетами до того, где происходит стандартное поведение (обычно в привязках классов). Tk имеет простой встроенный механизм, позволяющий остановить события от дальнейшей обработки.

Во-вторых, вам нужно убедиться, что вы отправляете фокус на соответствующий виджет. Существует встроенная поддержка для определения того, что следующий виджет.

Например:

def focus_next_window(event):
    event.widget.tk_focusNext().focus()
    return("break")

text_widget=Text(...)
text_widget.bind("<Tab>", focus_next_window)

Важные моменты по этому коду:

  • Метод tk_focusNext() возвращает следующий виджет в иерархию обхода клавиатуры.
  • метод focus() устанавливает фокус на этот виджет
  • return "break" имеет решающее значение в том смысле, что он препятствует общению класса при запуске. Это привязка класса, которая вставляет символ табуляции, который вам не нужен.

Если вы хотите, чтобы это поведение для всех текстовых виджетов в приложении, вы можете использовать метод bind_class() вместо bind(), чтобы эта привязка затрагивала все текстовые виджеты.

Вы также можете привязать фокус отправки к очень конкретному виджету, но я рекомендую придерживаться порядка обхода по умолчанию, а затем убедитесь, что порядок обхода верен.

Ответ 2

В PyQt4 очень просто использовать эту одну строчку ниже, и вы сможете изменить фокус, нажав кнопку табуляции:

self.textEdit.setTabChangesFocus(True)

Ответ 3

Не уверен в TKinter, но с PyQt можно подключить функцию к вкладке, измененному сигналом, выведенным полем вкладок (сигнал также несет значение int). Но насколько я знаю, Qt очень хорош в том, чтобы делать правильные вещи, не указывая их.

Ответ 4

Обход фокуса можно настраивать, обычно это позволяет диспетчеру X windows (с фокусом следовать за мышью или щелчком мыши). В соответствии с руководством должна быть возможность bind событие к событию нажатия клавиши, для нажатий вкладок и запуска события focusNext в этих случаях.