【问题标题】:Get mouse deltas using Python! (in Linux)使用 Python 获取鼠标增量! (在 Linux 中)
【发布时间】:2011-06-18 20:31:45
【问题描述】:

我知道 Linux 从 /dev/input/mice 中发出 9 位 2 的补码数据。我也知道您可以通过 /dev/hidraw0 获取该数据,其中 hidraw 是您的 USB 设备,它从 HID 发出原始数据。我知道发送的数据是运动(位移)的增量而不是位置。我还可以通过“cat /dev/input/mice”查看乱码数据。我的问题是:

您能告诉我使用 Python 语言如何读取这些数据吗?我真的更愿意以简单整数的形式获取这些数据。但事实证明这很难。真正的问题是读取该死的数据。有没有办法读取位并进行位算术? (目前我不担心与 root 用户相关的问题。请假设脚本在 root 中运行。)

(我的主要参考是http://www.computer-engineering.org/ps2mouse/

【问题讨论】:

    标签: python linux mouse hid


    【解决方案1】:

    我使用的是基本设备,无法访问 X 或 ... 所以 event.py 不起作用。

    所以这是我从“已弃用”'/dev/input/mice' 解释的更简单的解码代码部分:

    import struct
    
    file = open( "/dev/input/mice", "rb" );
    
    def getMouseEvent():
      buf = file.read(3);
      button = ord( buf[0] );
      bLeft = button & 0x1;
      bMiddle = ( button & 0x4 ) > 0;
      bRight = ( button & 0x2 ) > 0;
      x,y = struct.unpack( "bb", buf[1:] );
      print ("L:%d, M: %d, R: %d, x: %d, y: %d\n" % (bLeft,bMiddle,bRight, x, y) );
      # return stuffs
    
    while( 1 ):
      getMouseEvent();
    file.close();
    

    【讨论】:

    • 请注意,您需要以 root 身份运行。
    • 我一直在寻找定义这 3 个字节的结构,但它可能不存在。感谢这个例子。
    • 这一行必须是字符串类型:button = ord( str(buf[0])[0] ); 但是没有root权限怎么使用呢?
    • /dev/input/mice 只能由 root 读取。如果您有一次 root 访问权限,您可以将权限更改为用户的“r”。但是在我拥有的硬件上,每次重新启动后都会重写此文件的文件权限。
    • 谢谢,这对我有用,但我必须以 root 身份打开我的编辑器才能绕过与 /dev/input/mice 相关的读取权限
    【解决方案2】:

    来自输入系统的数据以结构形式出现,而不是简单的整数。我相信,鼠标设备已被弃用。首选方法是事件设备接口,也可以在其中获取鼠标(和其他)输入事件。我写了一些代码来做到这一点,Event.py module 你可以使用它,或者从那里开始。

    【讨论】:

    • 哇!!不错的代码!我目前正在浏览它。只是一个问题,虽然你如何获得移动我可以在第 307 行看到鼠标按钮代码。你能给我一个简短的例子来说明我如何使用它吗?
    • @john 谢谢!现在我没有鼠标特定的例子,但我会看看我是否可以提供一个。目前,PowerMate knob 有一个具体的设备接口示例,它是一个类似的相对运动设备。底部的自检是另一个例子。然后有一个small app 用它作为音量控制和屏幕显示。
    • 我刚刚发现你给我发了一个答案。我会检查一下。你找到鼠标的具体例子了吗?
    • @john 好的,basic mouse interface.
    • 'evdev' 包似乎可以对此进行规范化。
    【解决方案3】:

    是的,Python 可以读取二进制形式的文件。打开文件时只需使用'b' 标志,例如open('dev/input/mice', 'rb').

    Python 还支持所有典型的按位算术运算:移位、反转、按位与、或、异或、非等。

    不过,最好使用库来处理这些数据,而不是自己处理。

    【讨论】:

    • 感谢您的及时回复。一个问题虽然开发/输入/鼠标不断变化,因为鼠标位置不断变化,有没有办法实时读取它?
    • @JohnRoach 我不确定。不过,您通常不希望读取在您读取数据时会发生变化的数据。同样,这里最好的想法是使用一个为您完成所有艰苦工作的库
    • @Rafe Kettler 我试过使用 open() 它没有用。我只是使用 f=open('/dev/input/mice', 'rb') 作为 f: 打印行中的行,而且似乎无法从该文件中读取实时数据 :( 你能推荐一个库吗?当然,这一切都在循环中。:)
    • @JohnRoach 会发生什么,它可能会在文件上获得一个锁,然后在获得锁时只使用数据。这就是文件 IO 在大多数语言中的工作方式。遗憾的是,您需要的不仅仅是文件 IO 来实时处理鼠标数据
    • @JohnRoach 可以在pypi.python.org/… 找到“鼠标”Python 包的列表;看起来PyMouse 可能适合您的目的。
    【解决方案4】:

    您需要以 root 身份打开您的编辑器,以绕过您在尝试运行此脚本时可能遇到的与权限相关的错误消息。 /dev/input/mice 设备仅对 root 可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多