Изменить фокус с одного текстового виджета на другой - PullRequest
11 голосов
/ 20 сентября 2009

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

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

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

Ответы [ 4 ]

19 голосов
/ 20 сентября 2009

Это очень легко сделать с помощью 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() устанавливает фокус на этот виджет
  • возврат "break" является критическим в том смысле, что он предотвращает срабатывание привязки класса. Именно эта привязка класса вставляет символ табуляции, который вам не нужен.

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

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

0 голосов
/ 18 января 2017

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

self.textEdit.setTabChangesFocus (True)

0 голосов
/ 20 сентября 2009

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

0 голосов
/ 20 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...