用python打印键即刻按下屏幕

时间:2011-05-27 12:00:58

标签: python keyboard keypress

我知道这个问题很长,但我真正想知道的是粗体。

我更喜欢在Linux上使用python。

我正在尝试制作类似devorak的新键盘布局,但布局设置为layout1或layout2,具体取决于您是否持有热键(热键应该是ctrl?)

e.g。按d - > “z”使用键布局1打印到屏幕

e.g。按ctrl d - > “x”使用键布局2打印到屏幕

我的主要问题(以及需要回答的问题)是角色需要打印到屏幕的方式。

如果有人按下按键(按此顺序)“(a)(b)(c)(d)(ctrl + d)(shift + e = E)(f)(回车)”

现在假设这些按键的输出应为“oijzxKb” 我不希望输出用新行渲染:

o
i
j
z
x
K
b

我希望在按下每个角色时,角色会立即出现在屏幕上(无需等待他们按回车键)。

e.g.
press o

Screenshot1 o

press i

Screenshot2 oi

press j

Screenshot3 oij

.. etc

我假设我需要以下内容:

  • 立即阅读按键的方法
  • 一种立即打印按键的方法(终端或GUI或最初最简单的方式,如果它适用于任何编辑器,那将很酷!)

我可以在PyGame中做到这一点(但我可能无法剪切和粘贴等)而且我猜应该有一种更简单的方法。

我正在使用罗技G110键盘,我最终可能希望在我的所有设备上使用它作为我的qwerty键盘的替代品。

谢谢!

编辑:解决方案:

感谢第一反应, 使用来自http://code.activestate.com/recipes/134892/

的Getch
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并按下按键,则无法区分大小写的区别)

3 个答案:

答案 0 :(得分:2)

如果可以依赖X窗口系统,您可以使用python-xlib模块或xpyb模块访问X窗口系统并使用XGrabKey调用来抓取键盘相关事件。每次KeyPress事件后,您都可以打印按下的键。

现在,如果您真的想要编写一个键映射,这完全取决于OS /窗口系统。如果您使用X窗口系统(Ubuntu),您需要检查有关如何编写新键映射的X文档。在Ubuntu上,当前的键映射定义应该在/usr/share/X11/xkb中。看一看,然后尝试复制和编辑一个。您可以使用setxkbmap更改当前的键盘映射。

答案 1 :(得分:1)

请参阅此StackOverflow问题: Python read a single character from the user

评分最高的答案有以下链接: http://code.activestate.com/recipes/134892/

答案 2 :(得分:1)

要修改键盘的键映射,必须使用操作系统提供的工具。出于安全原因,大多数应用程序不接受生成的事件。

在您的情况下,那将是xmodmap。不要忘记使用-pke选项创建当前键盘映射的备份,因为您将犯错误 - 然后,您的键盘将不再起作用。

如果您还希望新的键盘映射在控制台上运行,请使用look at the kbd package更改内核级别的键盘布局。