5

I'm trying to get the raw input of my keyboard in python. I have a Logitech gaming keyboard with programmable keys, but Logitech doesn't provide drivers for Linux. So i thought i could (try) to write my own driver for this. In think the solution could be something like:

with open('/dev/keyboard', 'rb') as keyboard:
    while True:
        inp = keyboard.read()
        -do something-

English isn't my native language. If you find errors, please correct it.

4

2 回答 2

2


两种依赖操作系统处理键盘的输入法

import sys
for line in sys.stdin.readlines():
    print line

这是解决您的问题的一个“简单”解决方案,因为它读取 sys.stdin 您可能需要一个驱动程序,并且如果操作系统沿途剥离东西,它可能无论如何都会中断。

这是另一种解决方案(仅限linux afaik):

import sys, select, tty, termios
class NonBlockingConsole(object):
    def __enter__(self):
        self.old_settings = termios.tcgetattr(sys.stdin)
        tty.setcbreak(sys.stdin.fileno())
        return self

    def __exit__(self, type, value, traceback):
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings)

    def get_data(self):
        try:
            if select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):
                return sys.stdin.read(1)
        except:
            return '[CTRL-C]'
        return False

data = ''
printed = ''
last = ''
with NonBlockingConsole() as nbc:
    while 1:
        c = nbc.get_data()
        if c:
            if c == '\x1b': # x1b is ESC
                break
            elif c == '\x7f': # backspace
                data = data[:-1]
                printed = data[:-1]
                last = ''
                sys.stdout.write('\b')
            elif c == '[CTRL-C]':
                data = ''
                last = ''
                sys.stdout.write('\n')
            elif c == '\n': # it's RETURN
                sys.stdout.write('\n')
                # parse data here
                data = ''
            else:
                data += (c)
                last = c
                sys.stdout.write(c)

驱动问题?

如果上述方法都不起作用,您将无法在 Python 中获取密钥。
很可能您需要一个实际的驱动程序来解析从键盘发送的数据,这不是 USB 堆栈上的正常键盘事件,这意味着.. 这是 Python 的低级方式,您不走运。 .. 除非您知道如何构建 linux 驱动程序。

无论如何,看看:http ://ubuntuforums.org/showthread.php?t=1490385

看起来更多的人试图对此做些什么。

尝试 PyUSB

http://pyusb.sourceforge.net/docs/1.0/tutorial.html

您可以尝试使用 PyUSB 解决方案并从 USB 插座获取原始数据,但同样......如果 G 键未注册为“传统”USB 数据,它可能会被丢弃并且您不会收到它。

在 Linux 中连接到输入管道

另一种未经测试的方法,但可能有效 //Hackaday: 在此处输入图像描述

于 2013-05-14T15:53:39.553 回答
0

罗技不提供 Linux 驱动程序。所以我想我可以(尝试)为此编写自己的驱动程序。

Linux 驱动程序是用 C 编写的;它是非常低级的代码并在内核空间中运行。

于 2013-05-14T16:03:38.690 回答