在Python curses中检测大写锁定键

4 投票
2 回答
2584 浏览
提问于 2025-04-16 01:00

对于这样一个基础的问题,我很惊讶我搜索了半天也没找到相关内容...

不过,我用Python做了一个curses应用程序,帮助解决某个DSiWare游戏的谜题。通过这个程序,你可以单独查看谜题的各个部分。按下qweasdzx这些键可以给图块上色(这些键就像调色板一样排列)。当你按住Shift键的同时按这些键时,就会高亮显示该颜色的图块。我觉得这个控制方式非常自然。

所以很遗憾,这次Shift键又让我遇到麻烦了(上次我遇到Shift键的问题时,还获得了一个“ tumbleweed”徽章)。不过这次的问题主要是Caps Lock,它完全搞乱了我的程序,导致功能反转。

我该如何在Python中用curses检测Caps Lock的状态呢?

补充:如果你打算建议使用其他模块,我可能需要提醒你,curses——也就是我的程序——是在UNIX环境下的。

2 个回答

3

简单来说:你不能这么做。

再详细一点:

curses 是一个基于 terminfo 的库,目的是为了让我们更容易创建基于字符的用户界面,而不管使用的是哪种终端(比如 for terminal in 'vt220', 'wyse100', …)。

这些终端通过串行线连接,和主机之间的通信可以是普通文本(用户输入的或者主机输出的),也可以是特殊的指令序列(也叫“转义序列”;用户按下特殊键时输入,比如 Prev,或者主机在需要进行特殊操作时输出,比如光标定位或清屏)。

我不知道有哪个“傻终端”会在 Caps Lock 键被按下时发送特殊指令,或者主机会询问 Caps Lock 的状态;锁定大写字母是终端的工作,主机并不需要知道这个状态。这就像你不能让 curses 程序在单独按下 Control 键时做出反应一样。

curses 的一切都和 terminfo 的功能有关;你问的这个功能并不存在。

7

我自己找到了一个解决办法:

根据ΤΖΩΤΖΙΟΥ的说法,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的解决方案。

我暂时会接受这个自我回答,但如果有人能想出一个更好的解决办法,我很想看看。

撰写回答