【问题标题】:Python pynput - program lags upon startPython pynput - 程序在启动时滞后
【发布时间】:2019-07-10 16:53:15
【问题描述】:

所以我一直在尝试制作一个简单的程序,在单击鼠标右键时,让我的鼠标以 0.5 秒的间隔单击左键 3 次。但是,当我启动程序并单击鼠标右键时,程序会按照它的指示执行操作,但也会开始可怕地滞后约 25 秒。在它完成滞后并且我尝试关闭程序后,它冻结了,迫使我通过任务管理器关闭它。

代码如下:

import time
from pynput.mouse import Button, Controller, Listener

mouse = Controller()

def on_click(x, y, button, pressed):
    if button == Button.right:
        num = 3
        while num > 0:
            time.sleep(0.5)
            mouse.click(Button.left)
            num -= 1

with Listener(on_click=on_click) as listener:
    listener.join()

非常感谢任何帮助。

【问题讨论】:

  • 我有理由相信这种滞后是 time.sleep() 在 pynput 监听函数中的副产品,考虑使用 sched 来消除对 time.sleep() 的需求。

标签: python-3.x pynput


【解决方案1】:

经过一段时间的调试和挖掘问题,pynput.mouse.Listener 在 Windows 机器上移动鼠标时似乎有一些问题。

在 Linux 机器上,一切都应该开箱即用,没有挂起或滞后。

【讨论】:

  • 快进到将近 2021 年,问题仍然存在。几乎每次收到点击事件时它都会滞后,而且我无法找到替代方案,如 pyautogui,据其作者说,不监听此类事件,pyhook 不适用于 @987654324 @。还有其他可能吗?
【解决方案2】:

您需要使用pressed 变量。 它似乎保存了按钮是按下还是释放的值。

没有这个,循环在释放时也会重复一次。

这对我来说按预期工作:

import time
from pynput.mouse import Button, Controller, Listener

mouse = Controller()

def on_click(x, y, button, pressed):
    if button == Button.right and pressed:
        num = 3
        while num > 0:
            print("Clicked")
            time.sleep(0.5)
            mouse.click(Button.left)
            num -= 1
        print("Done")

with Listener(on_click=on_click) as listener:
    listener.join()

【讨论】:

  • 嗯,它现在确实工作得更好,但滞后仍然存在。现在没有无限循环了,但它在 3 次点击期间仍然滞后。
  • @AutonomousVariable 我在运行此程序(或您的原始代码)时没有发现任何延迟。它到底落后了多少?怎么了?您如何监控延迟?
  • @AutonomousVariable 啊,是的,这似乎是非常糟糕的滞后。您是否尝试过像这样从普通命令提示符在 IDLE 之外运行脚本? python script.py 有同样的结果吗?
  • 是的,同样可怕的延迟。
  • 有趣的是,我之前制作了一个非常相似的程序并且没有滞后。这是我第一次遇到这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多