Я пытаюсь привязать двойную кнопку мыши к функции, которая теперь просто печатает текущий выбор в окне списка Tkinter. Чтобы быть ясным, функция должна печататься только тогда, когда пользователь дважды нажимает на один из элементов списка Tkinter. Какую привязку событий я должен использовать?Tkinter binding mouse двойной щелчок
ответ
Вы можете связываться с <Double-Button-1>
:
widget.bind('<Double-Button-1>', handler)
Существует также <Button-1>
для нормальных щелчков мыши и <Triple-Button-1>
для тройного щелчка мыши.
Дополнительную информацию о креплениях в Tkinter см. Events and Bindings.
Вы должны понимать, что для всех виджетов существует иерархия, а это означает, что для каждого выбранного виджета возможны несколько привязок. Если вы не переопределяете действие по умолчанию, вызывается каждый обработчик по умолчанию иерархии, начиная с самого низкого уровня (например, с вашего списка) и добирается до виджета Tk() или Toplevel(). Для вас, так как вы хотите, чтобы напечатать только тогда, когда элемент ListBox нажата, вы можете привязать к ListBox виджета, следующим образом:
listboxWidget.bind('<Double-Button-1>', listboxWidget_leftclick_handler)
Затем, когда вы вводите функцию def listboxWidget_leftclick_handler(event)
, вы не должны проверить значение event.widget, чтобы узнать, является ли это именем вашего виджета Listbox. Но вы также можете проверить на более высоком уровне (привязать обработчик к виджету более высокого уровня) и проверить event.widget, чтобы увидеть, какой виджет был нажат.
Также обратите внимание, что единственный способ предотвратить запуск всей иерархии обработчиков событий с помощью return 'break'
из вашего пользовательского обработчика, но вам обычно нужно только это делать, если последующие обработчики повреждают то, что сделал ваш пользовательский обработчик.
** Дополнительная информация о обработчиков по умолчанию **
Другая часть, которую я оставил вне что есть и «по умолчанию» обработчик для большинства событий. Если вы привяжете свой обработчик, как только он будет завершен, если вы не сделаете return 'break'
, по умолчанию будет вызываться обработчик по умолчанию.
Например, предположим, что вы хотите сделать свой собственный поле ввода вводом пароля. По умолчанию, когда вы вводите буквенно-цифровые символы, когда запись имеет фокус (что означает, что он получает ввод с клавиатуры), символы появятся в записи. Вы можете связать
myEntry.bind('<KeyPress>', passworder)
где Passworder (событие) ваш пользовательский обработчик, который захватывает событие держит ваш введенный символ, а затем выводит звездочку в сени вместо этого. Но, если вы не используете return "break"
в конце вашего обработчика, виджет Entry по-прежнему будет видеть этот символ, который вам не нужен, потому что как только ваш обработчик будет вставлен в звездочку, обработчик по умолчанию будет просто вставьте типизированный символ (как обычно). Но если вы делаете return 'break'
, обработчик по умолчанию не будет вызван, и типизированные символы не будут отображаться в записи.