Как запретить команду кнопки, если нажатие кнопки также установило фокус? - PullRequest
0 голосов
/ 02 апреля 2019

У моего приложения есть команда, связанная с кнопками мыши.Я пришел к выводу, что это раздражает, когда вы щелкаете окно, чтобы установить фокус, и он также выполняет команду кнопки.

Вот строка, привязывающая мою команду к кнопке 1:

bind .f.canvas <Button-1> {panto %W %x %y 0.5}; # pan half distance

Как запретить вызов команды кнопки, когда нажатие кнопки также используется для установки фокуса?


Вот моя «последовательность тестов»:

  1. Открыть программу
  2. Нажмите на холст.Желаемый / Результат: Перемещение в положение щелчка.
  3. Нажмите на рабочий стол.
  4. Нажмите на холсте.Желаемый: нет кастрюли.Результат: панорамирование в положение щелчка.
  5. Нажмите на холст.Желаемый / Результат: Переместить в положение щелчка.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Мое текущее решение немного взломано.Я вожу контрейлер на событие фокуса клавиатуры на виджете ввода, временно отключая команду кнопки, когда запись не в фокусе:

ttk::entry .f.cmd -textvar e -width 30
bind .f.cmd <FocusOut> {
  puts "focus out, disable button press"; 
  bind .f.canvas <Button-1> {}
}
bind .f.cmd <FocusIn> {
  puts "focus in, enable button press starting next event"; 
  after idle {
    bind .f.canvas <Button-1> {
      panto %%W %%x %%y 0.5
    }
  };
}

Проверено на Win10, Tcl 8.6.

0 голосов
/ 02 апреля 2019

Если вы завершите свой сценарий привязки с break, он не будет запускать другие сценарии, связанные с этим событием (например, на уровне класса виджетов, на уровне всего окна или на уровне всего приложения). Конкретно, вы делаете это:

bind .f.canvas <Button-1> {
    panto %W %x %y 0.5; # pan half distance
    break
}

Подобные вещи являются одним из немногих случаев, когда рекомендуются сценарии связывания с несколькими командами. Как правило, лучше (для понятности) извлечь вещи в процедуру, но в этом случае лучше поставить break напрямую.

...