当监控过程中出现双击时,我面临一个问题。“有人能给我提供一个代码来监视鼠标,如何使用pynput在python中双击吗?”
发布于 2020-08-31 19:46:40
当您想要获得同时也是double click的时候,没有一种简单的方法可以获得single click。
要控制double click (不控制single click),您可以记住什么时候是previous click,并与current click进行比较。如果是差异的话。0.3s,那么你就可以把它当作double click了。
仅用于左键的代码
from pynput.mouse import Listener, Button
import time
previous_left = 0
def on_click(x, y, button, pressed):
global previous_left
#text = 'Pressed' if pressed else 'Released'
#print('{0} {1} at {2}'.format(text, button, (x, y)))
double_click_left = False
# double click left button
if pressed and button == Button.left:
current_left = time.time()
diff_left = current_left - previous_left
print('diff left:', diff_left)
if diff_left < 0.3:
print('double click left')
double_click_left = True
previous_left = current_left
# other code
if double_click_left:
# Stop listener
return False
with Listener(on_click=on_click) as listener:
# ... some code ...
listener.join()其他按钮的代码类似。
from pynput.mouse import Listener, Button
import time
previous_left = 0
previous_right = 0
previous_middle = 0
def on_click(x, y, button, pressed):
global previous_left
global previous_right
global previous_middle
#text = 'Pressed' if pressed else 'Released'
#print('{0} {1} at {2}'.format(text, button, (x, y)))
double_click_left = False
double_click_right = False
double_click_middle = False
# double click left button
if pressed and button == Button.left:
current_left = time.time()
diff_left = current_left - previous_left
print('diff left:', diff_left)
if diff_left < 0.3:
print('double click left')
double_click_left = True
previous_left = current_left
# double click right button
if pressed and button == Button.right:
current_right = time.time()
diff_right = current_right - previous_right
print('diff right:', diff_right)
if diff_right < 0.3:
print('double click right')
double_click_right = True
previous_right = current_right
# double click middle button
if pressed and button == Button.middle:
current_middle = time.time()
diff_middle = current_middle - previous_middle
print('diff middle:', diff_middle)
if diff_middle < 0.3:
print('double click middle')
double_click_middle = True
previous_middle = current_middle
# other code
if double_click_left:
# Stop listener
return False
with Listener(on_click=on_click) as listener:
# ... some code ...
listener.join()但问题是,当您还想控制单次单击时,因为它将在第一次单击之后运行一些函数0.3s,以通知您它不是双击而是单次单击--它需要线程定时器,或者需要运行其他线程,在所有时间都运行循环,将curren时间与previous_left进行比较,如果在previous_left之后没有单击0.3s,则将其视为单击。
我没有这种情况的例子。
发布于 2022-05-28 13:11:48
除了@furas的答案,我想建议如何处理单一和双点击事件。您只需创建一个将创建线程的函数,并从侦听器调用它:
import threading
from pynput.mouse import Listener, Button
import time
previous_left = 0
previous_right = 0
previous_middle = 0
def click_handler(x,y,button, pressed):
x = threading.Thread(target=on_click, args=(x,y,button,pressed))
x.start()
def on_click(x, y, button, pressed):
# The code from the comment above to deal with click AND double click
...
with Listener(on_click=click_handler) as listener:
listener.join()https://stackoverflow.com/questions/63676373
复制相似问题