用Python实时打印按键输入到屏幕上

0 投票
2 回答
6843 浏览
提问于 2025-04-16 18:27

我知道这个问题有点长,但我真正想知道的内容是加粗的部分。

我更喜欢在Linux上使用Python。

我想制作一个新的键盘布局,类似于devorak,但这个布局会根据你是否按住一个热键(可能是ctrl键)来切换为布局1或布局2。

比如说,按下d键时,使用布局1会在屏幕上显示“z”。

再比如,按下ctrl+d时,使用布局2会在屏幕上显示“x”。

我主要的问题(也是需要回答的问题)是字符如何在屏幕上显示。

如果有人按下这些键(顺序是“(a)(b)(c)(d)(ctrl+d)(shift+e=E)(f)(Enter)”),

假设这些按键的输出应该是“oijzxKb”,我不想让输出换行:

o
i
j
z
x
K
b

我希望每按下一个字符,它就能立刻在屏幕上显示出来(不需要等到按下回车键)。

e.g.
press o

Screenshot1 o

press i

Screenshot2 oi

press j

Screenshot3 oij

.. etc

我想我需要以下内容:

  • 一种能够即时读取按键的方法
  • 一种能够即时打印按键的方法(可以打印到终端、图形界面或其他最简单的地方,如果能在任何编辑器上工作就更好了!)

我可能可以在PyGame中做到这一点(但那样的话,我可能就不能剪切和粘贴等),我猜应该有更简单的方法。

我正在使用Logitech G110键盘,最终我可能想把这个作为我所有设备上qwerty键盘的替代品。

谢谢!

编辑:解决方案:

感谢第一个回复,使用Getch来自http://code.activestate.com/recipes/134892/

getch = _Getch()
word=""
while True:
    c=getch.impl()
    if c=="a":
        word+="z"
    elif ord(c)==127: #backspace
        word=word[:-1]
    else:
        word+=c
    print word

这暂时足够了,谢谢你。一旦我对改进感到满意,我会考虑做一些更底层的、特定于操作系统的东西,而不使用Python。

不过,使用getch有一个问题,就是ctrl+a和ctrl+A无法区分(例如,如果你按住ctrl键并按其他键,它无法区分大小写)。

2 个回答

1

要修改你键盘的按键映射,你需要使用操作系统提供的工具。大多数应用程序出于安全考虑,不会接受自动生成的按键事件。

在你的情况下,可以使用 xmodmap。别忘了用 -pke 选项备份你当前的按键映射,因为你可能会犯错误——这样一来,你的键盘就可能无法使用了。

如果你还想让新的按键映射在控制台上也能用,可以去看看 这个 kbd,它可以在内核层面上更改键盘布局。

3

如果你可以依赖X窗口系统的话,可以使用python-xlib模块或者xpyb模块来访问X窗口系统,并使用XGrabKey这个调用来捕捉与键盘相关的事件。每当有KeyPress事件发生时,你就能打印出被按下的键。

如果你真的想写一个键盘映射,这就完全依赖于操作系统或窗口系统了。如果你使用的是X窗口系统(比如Ubuntu就是),你需要查看X的文档,了解如何写一个新的键盘映射。在Ubuntu中,当前的键盘映射定义应该在/usr/share/X11/xkb这个路径下。你可以去看看,尝试复制并编辑其中一个。然后你可以使用setxkbmap来更改当前的键盘映射。

撰写回答