在 Python curses 中检测大写锁定键

4
对于这样一个基础的问题,我很惊讶居然搜索不到任何东西...
无论如何,我在Python中制作了一个curses应用程序,用于辅助解决某个DSiWare游戏的难题。通过它,您可以单独检查拼图的组件。按键qweasdzx用于绘制图块(这些键排列在某种调色板中)。按住Shift并按下其中一个键时,会突出显示该颜色的图块。我再也找不到更自然的控制方案了。
所以很遗憾,再一次,Shift键给我带来了问题(上次我也遇到了Shift键的问题,结果获得了Tumbleweed徽章)。不过这次,问题或多或少是由Caps Lock引起的,它完全通过反转功能来破坏我的程序。
如何使用curses在Python中检测Caps Lock的状态?
编辑:如果您要建议使用单独的模块,我可能应该提醒您,curses - 因此我的程序 - 处于UNIX领域。
2个回答

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 个字符)是大写锁定标志。如果大写锁定开启,则为 1,否则为 0。
Python 可以通过仅适用于 Linux 的commands模块运行 UNIX 系统命令。该模块似乎不会干扰 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的解决方案。
我暂时接受这个自答,但如果有人能提出更好的解决方案,我会很乐意看到它。

+1:这是解决您问题的方案,所以我会点赞;不过在能够将自己的答案标记为“答案”之前,您需要先累积一些声望。 - tzot
看起来时间是决定是否能接受自己答案的唯一因素,因为我在48小时后才能接受这个答案。我想提醒其他用户,即使我已经接受了这个答案,如果有人在访问这个问题时提供了更好的答案,我很乐意更改我的选择。 - Exp HP
1
请注意,此解决方案仅适用于在X窗口下运行的情况。它在Linux控制台上不起作用,如果您未启用某种形式的X转发远程连接(即ssh),它也无法工作。 - Craig

3
简短回答:你不能。
更详细的回答:
curses 是一个基于 terminfo 的库,旨在简化字符界面(UI)的创建,与使用的终端无关(例如 'vt220'、'wyse100' 等)。
这些终端通过串行线连接,并通过纯文本(用户输入或主机输出)或特殊序列(“转义”序列;如果按下特殊键,如 Prev,则由用户输入,或者如果请求特殊操作,如光标定位或屏幕清除,则由主机输出)进行来回通信。
我不知道有任何愚蠢的终端会在按下 Caps Lock 键时发送特殊序列,或者主机查询 Caps Lock 状态;锁定大写字母是终端的工作,主机不需要任何知识。这类似于你不能让 curses 程序在仅按下 Control 键时执行操作的原因。
curses 的所有内容都与 terminfo 功能相关;没有任何相关功能可以满足你的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接