用Python实时打印按键输入到屏幕上
我知道这个问题有点长,但我真正想知道的内容是加粗的部分。
我更喜欢在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 个回答
要修改你键盘的按键映射,你需要使用操作系统提供的工具。大多数应用程序出于安全考虑,不会接受自动生成的按键事件。
在你的情况下,可以使用 xmodmap
。别忘了用 -pke
选项备份你当前的按键映射,因为你可能会犯错误——这样一来,你的键盘就可能无法使用了。
如果你还想让新的按键映射在控制台上也能用,可以去看看 这个 kbd
包,它可以在内核层面上更改键盘布局。
如果你可以依赖X窗口系统的话,可以使用python-xlib模块或者xpyb模块来访问X窗口系统,并使用XGrabKey这个调用来捕捉与键盘相关的事件。每当有KeyPress
事件发生时,你就能打印出被按下的键。
如果你真的想写一个键盘映射,这就完全依赖于操作系统或窗口系统了。如果你使用的是X窗口系统(比如Ubuntu就是),你需要查看X的文档,了解如何写一个新的键盘映射。在Ubuntu中,当前的键盘映射定义应该在/usr/share/X11/xkb
这个路径下。你可以去看看,尝试复制并编辑其中一个。然后你可以使用setxkbmap
来更改当前的键盘映射。