如何使用 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()
虽然不是特别精彩,但还是给大家截图一下吧运行:
我想使用 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()
虽然不是特别精彩,但还是给大家截图一下吧运行: