Tkinter привязка мыши двойной щелчок


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

3 3

3 ответа:

Можно привязать к <Double-Button-1>:

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

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

Дополнительную информацию о привязках в Tkinter смотрите в разделесобытия и привязки .

Вы должны понимать, что существует иерархия для всех виджетов, и это означает, что для каждого виджета, который вы нажимаете, возможны несколько Привязок. Если действие по умолчанию не переопределено, вызывается обработчик по умолчанию для каждой иерархии, начиная с самого нижнего уровня (например, списка) и вплоть до виджета Tk () или Toplevel (). Поскольку вы хотите печатать только при нажатии на элемент списка, вы можете привязать его к виджету списка, как показано ниже:

listboxWidget.bind('<Double-Button-1>', listboxWidget_leftclick_handler)

Затем, когда вы вводите функцию def listboxWidget_leftclick_handler(event), вам не нужно проверять событие.значение виджета, чтобы узнать, является ли это именем виджета Listbox. Но вы также можете проверить на более высоком уровне (привязать обработчик к виджету более высокого уровня)и проверить событие.виджет, чтобы увидеть, какой виджет был нажат.

Кроме того, обратите внимание, что единственный способ предотвратить запуск всей иерархии обработчиков событий - это использовать return 'break' из вашего пользовательского обработчика, но обычно это нужно делать только в том случае, если более поздние обработчики повреждают то, что вы пользовательский обработчик сделал.

Дополнительная информация о обработчиках по умолчанию

Другая часть, которую я пропустил, заключается в том, что для большинства событий также существует обработчик" по умолчанию". Если вы свяжете свой собственный обработчик, после его завершения, если вы этого не сделаете return 'break', обработчик по умолчанию будет вызван следующим.

Например, предположим, что вы хотите сделать свое собственное поле ввода в поле ввода пароля. По умолчанию, когда вы вводите буквенно-цифровые символы, когда запись имеет фокус (что означает, что она получает ввод от клавиатура), символы появятся в записи. Вы можете связать

myEntry.bind('<KeyPress>', passworder)

Где passworder (event) - это ваш пользовательский обработчик, который захватывает событие, содержащее введенный символ, а затем выводит звездочку в запись. Но, если вы не используете return "break" в конце обработчика, виджет ввода все равно увидит тот символ, который вы не хотели показывать, потому что, как только обработчик закончит вставку звездочки, обработчик по умолчанию просто вставит типизированный символ (например это было бы нормально). Но, если вы сделаете return 'break', обработчик по умолчанию не будет вызван, и типизированный символ(ы) не появится в записи.

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

from tkinter import *

def mouse_click(event):
    '''  delay mouse action to allow for double click to occur
    '''
    aw.after(300, mouse_action, event)

def double_click(event):
    '''  set the double click status flag
    '''
    global double_click_flag
    double_click_flag = True

def mouse_action(event):
    global double_click_flag
    if double_click_flag:
        print('double mouse click event')
        double_click_flag = False
    else:
        print('single mouse click event')

root = Tk()
aw = Canvas(root, width=200, height=100, bg='grey')
aw.place(x=0, y=0)

double_click_flag = False
aw.bind('<Button-1>', mouse_click) # bind left mouse click
aw.bind('<Double-1>', double_click) # bind double left clicks
aw.mainloop()