Виджеты Tcl / Tk и FocusOut не работают должным образом в Linux - PullRequest
0 голосов
/ 06 июля 2011

Кто-нибудь знает, почему событие FocusOut не работает на Linux?

У меня есть 1 включенное текстовое поле и 3 отключенных поля со списком. Я связываю текстовое поле с событием FocusOut, где оно вызывает метод, который включает или отключает комбинированный список 3.

Отлично работает на Windows. Однако, кажется, что это не вызывает событие FocusOut, когда это действие выполняется в Linux. Одна странная вещь заключается в том, что, если я нажимаю на кнопки, событие FocusOut, похоже, запускается.

Может быть, потому что мой комбинированный список отключен? Но почему он работает в Windows?

Я действительно надеюсь, что кто-нибудь может мне помочь, пожалуйста.

Заранее спасибо.

1 Ответ

1 голос
/ 06 июля 2011

В прошлом я наблюдал, что некоторые оконные менеджеры временно крадут фокус у Tk при каждом нажатии кнопки, прежде чем вернуть его обратно;Я подозреваю, что это связано с тем, как работает обработка ключевых событий, но я не могу проверить в данный момент (из-за того, что на OSX, где вещи отличаются ).Из-за сложностей, связанных с этим, я бы предложил, чтобы, если вы связались с <FocusOut>, вы также проверили, получите ли вы событие <FocusIn> вскоре после этого;небольшая дополнительная задержка (например, 0,1 с) перед обновлением отключенного состояния кнопок не помешает.

Или вы можете повесить код, чтобы отключить механизм проверки виджетов ввода , возможно, вот так:

.e configure -validation focusout -validatecommand doButtonEnableDisable

Интерфейс проверки одинаков как для виджетов старого стиля entry, так и для виджетов нового стиля ttk::entry.Это также поддерживается спинбоксами.Просто знайте, что вам нужно вернуть логическое значение true из doButtonEnableDisable, иначе вы отклоните изменение в записи, и вы должны позаботиться о том, чтобы ваш код не выдавал ошибку или он сам отключился;документы перечисляют вещи, на которые следует обратить внимание.

...