2014-12-03 2 views
2

Я пытаюсь привязать двойную кнопку мыши к функции, которая теперь просто печатает текущий выбор в окне списка Tkinter. Чтобы быть ясным, функция должна печататься только тогда, когда пользователь дважды нажимает на один из элементов списка Tkinter. Какую привязку событий я должен использовать?Tkinter binding mouse двойной щелчок

ответ

6

Вы можете связываться с <Double-Button-1>:

widget.bind('<Double-Button-1>', handler) 

Существует также <Button-1> для нормальных щелчков мыши и <Triple-Button-1> для тройного щелчка мыши.

Дополнительную информацию о креплениях в Tkinter см. Events and Bindings.

0

Вы должны понимать, что для всех виджетов существует иерархия, а это означает, что для каждого выбранного виджета возможны несколько привязок. Если вы не переопределяете действие по умолчанию, вызывается каждый обработчик по умолчанию иерархии, начиная с самого низкого уровня (например, с вашего списка) и добирается до виджета 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', обработчик по умолчанию не будет вызван, и типизированные символы не будут отображаться в записи.