如何使用 tkinter 检测鼠标长按?

How can I detect long mouse clicks with tkinter?

我想使用 tkinter 检测鼠标长按。 我怎样才能做到这一点? <Button-1> 根本没有帮助。

您可以为按下按钮 (<ButtonPress-1>) 和释放按钮 (<ButtonRelease-1>) 创建绑定。保存按下发生的时间,然后计算释放发生时的延迟。

或者,根据“检测”的含义,您可以在单击按钮时将作业安排到 运行,然后如果按钮在超时之前被释放,则取消作业。

这里的代码演示了如何“检测”何时发生鼠标长按(@Bryan Oakley 提到的第二件事)。它通过将各种回调函数“绑定”到不同的 tkinter 事件来完成这一壮举,包括我编写的名为 '<<LongClick-1>>'.

的虚拟事件

它会显示一个window,里面有一个Label,表示鼠标的点击状态。如果您单击并按住鼠标按钮足够长的时间(2 秒),on_long_click() 事件处理函数将调用并相应地更改 Label 上的文本。

import tkinter as tk
from tkinter.constants import *
from time import perf_counter as cur_time


LONG_CLICK = 2.0  # Seconds.
start_time = None
timer = None
CHECKS_PER_SECOND = 100  # Frequency that a check for a long click is made.

root = tk.Tk()
root.geometry('100x100')

def on_button_down(event):
    global start_time, timer

    label.config(text='Click detected')
    start_time = cur_time()
    timing = True
    timer = check_time()


def check_time():
    global timer

    if (cur_time() - start_time) < LONG_CLICK:
        delay = 1000 // CHECKS_PER_SECOND  # Determine millisecond delay.
        timer = root.after(delay, check_time)  # Check again after delay.
    else:
        root.event_generate('<<LongClick-1>>')
        root.after_cancel(timer)
        timer = None


def on_button_up(event):
    global timer

    if timer:
        root.after_cancel(timer)
        timer = None
        label.config(text='Waiting')


def on_long_click(event):
    label.config(text='Long click detected')


label = tk.Label(root, text='Waiting')
label.pack(fill=BOTH, expand=1)

root.bind('<ButtonPress-1>', on_button_down)
root.bind('<ButtonRelease-1>', on_button_up)
root.bind('<<LongClick-1>>', on_long_click)

root.mainloop()

虽然不是特别精彩,但还是给大家截图一下吧运行: