在Python curses中检测大写锁定键
对于这样一个基础的问题,我很惊讶我搜索了半天也没找到相关内容...
不过,我用Python做了一个curses应用程序,帮助解决某个DSiWare游戏的谜题。通过这个程序,你可以单独查看谜题的各个部分。按下qweasdzx
这些键可以给图块上色(这些键就像调色板一样排列)。当你按住Shift键的同时按这些键时,就会高亮显示该颜色的图块。我觉得这个控制方式非常自然。
所以很遗憾,这次Shift键又让我遇到麻烦了(上次我遇到Shift键的问题时,还获得了一个“ tumbleweed”徽章)。不过这次的问题主要是Caps Lock,它完全搞乱了我的程序,导致功能反转。
我该如何在Python中用curses检测Caps Lock的状态呢?
补充:如果你打算建议使用其他模块,我可能需要提醒你,curses——也就是我的程序——是在UNIX环境下的。
2 个回答
简单来说:你不能这么做。
再详细一点:
curses 是一个基于 terminfo 的库,目的是为了让我们更容易创建基于字符的用户界面,而不管使用的是哪种终端(比如 for terminal in 'vt220', 'wyse100', …
)。
这些终端通过串行线连接,和主机之间的通信可以是普通文本(用户输入的或者主机输出的),也可以是特殊的指令序列(也叫“转义序列”;用户按下特殊键时输入,比如 ↑ 或 Prev,或者主机在需要进行特殊操作时输出,比如光标定位或清屏)。
我不知道有哪个“傻终端”会在 Caps Lock 键被按下时发送特殊指令,或者主机会询问 Caps Lock 的状态;锁定大写字母是终端的工作,主机并不需要知道这个状态。这就像你不能让 curses 程序在单独按下 Control 键时做出反应一样。
curses 的一切都和 terminfo 的功能有关;你问的这个功能并不存在。
我自己找到了一个解决办法:
根据ΤΖΩΤΖΙΟΥ的说法,curses完全不知道Caps Lock的状态,所以我尝试了另一种解决方案。具体来说,我查找了如何在BASH脚本中检查Caps Lock。我找到的内容是:
仅适用于Linux,需要X Window系统。
$ xset q | grep LED
> auto repeat: on key click percent: 0 LED mask: 00000000
输出中的最后一个0(字符串中的第66个字符)就是Caps Lock的标志。如果Caps Lock开启,显示1;如果关闭,显示0。
Python可以使用Linux专用的commands模块来运行UNIX系统命令。这个commands模块似乎不会干扰curses。
>>> import commands
>>> # Caps Lock is off.
>>> commands.getoutput("xset q | grep LED")[65]
'0'
>>> # Setting Caps Lock on now.
>>> commands.getoutput("xset q | grep LED")[65]
'1'
这个方法对我来说很好用;这是一个个人使用的脚本,而且我的程序本来就是Linux专用的。不过,我希望有人能提供一个更兼容Windows的解决方案。
我暂时会接受这个自我回答,但如果有人能想出一个更好的解决办法,我很想看看。