【问题标题】:Different output in mouse suppression pynput.mouse鼠标抑制 pynput.mouse 中的不同输出
【发布时间】:2021-02-05 11:53:35
【问题描述】:

我正在尝试锁定鼠标指针,但仍会收到鼠标移动。我通过在pynput.mouse.Listener 中添加suppress=True 几乎实现了这个目标:

def on_move(x, y):
    print(x, y)


with pynput.mouse.Listener(on_move=on_move, suppress=True) as listener:
    listener.join()

问题是当我开始移动鼠标时得到这样的输出:(x 在左边,y 在右边)

681 551
681 550
681 550
682 550
681 551
681 550
682 550
682 551

但是想像这样接收鼠标的移动:

1 0 (mouse moved one pixel right)
0 -1 (mouse moved one pixel up)
-1 1 (mouse moved one left and one pixel down)
1 1 (mouse moved one right and one pixel down)
...

当鼠标连续向右移动时,输出是这样的:

524 364
525 364
524 364
525 364
524 364
525 364
524 364
525 364

这意味着像这样x - prev_x这样使用之前的x作为变量将不会生效,并且会打印出来:

1 0
-1 0
1 0
-1 0
1 0
-1 0

不是这个:(我想要的输出)

1 0
1 0
1 0
1 0
1 0
1 0

【问题讨论】:

    标签: python mouseevent mouse pynput


    【解决方案1】:

    查看编辑后的问题并看到您的问题是您正在抑制鼠标移动,输出是合乎逻辑的。

    1 0    > you are moving the mouse 1 pixel to the right
    -1 0   > because the mouse is supressed it is moved back 1 pixel to it's original position
    

    当您按下鼠标时,此输出完全是预期的。

    我认为没有抑制鼠标的好方法,这将允许您想要的输出。

    如果您真的需要用户鼠标输入并且绝对不希望鼠标在屏幕上实际移动,但要让它在您的程序中执行某些操作,您可能想寻找不同的库来使用。

    【讨论】:

    • "你可能想寻找一个不同的库来使用。"你有一个可行的库的想法吗?
    【解决方案2】:

    该程序似乎已经按照您的意愿运行了,

    但不是将鼠标位置声明为相对位置(例如:“1,-1”),而是将其输出为绝对位置(例如:“681, 550”)。

    如果这确实是你的问题,解决方法很简单:

    lastx = 0
    lasty = 0
    
    def on_move(x, y):
        global lastx, lasty
        print(x - lastx, y - lasty)
        lastx = x
        lasty = y
    

    这样on_move() 将打印自上次调用函数以来您的鼠标移动了多少。

    然而,垂直移动将被“反转”,这意味着 -1 的 y 值的变化不是向下移动 1 个像素,而是向上移动 1 个像素。

    要使 y 在向下移动时减少而不是增加,这应该可行:

    lastx = 0
    lasty = 0
    
    def on_move(x, y):
        global lastx, lasty
        print(x - lastx, lasty - y)
        lastx = x
        lasty = y
    

    请注意,lasty 和 y 在这里交换,导致打印的垂直移动为 (-1) 倍,否则为其他情况。

    【讨论】:

    • 非常感谢!但我实际上尝试过这个。这样做的问题是 x 和 y 不会每次都重置。这意味着x - lastx 不会是鼠标的正确移动。我似乎无法解释这一点,但您可以尝试运行您的代码并亲自查看
    • 代码应该可以正常工作,但您可能遇到的问题是, (-1, -1) 不是像在大多数坐标系中那样向下 1 个像素和剩下 1 个像素。如果您希望它像普通坐标系一样工作(可能用于数学目的),您必须print(x - lastx, lasty - y)。请注意,对于垂直运动 (y),lasty 和 y 是交换的。
    • 我了解,但请查看我对问题的编辑。我添加了解释为什么此代码代码不起作用。它与监听器在被抑制时打印位置的方式相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多