检测Python curses中的Caps Lock

时间:2010-07-08 19:06:31

标签: python curses capslock

对于这样一个基本问题,我很惊讶我找不到任何搜索...

无论如何,我在Python中创建了一个curses应用程序,它有助于解决某个DSiWare游戏的难题。有了它,你可以拼图并单独检查它的组成部分。键qweasdzx用于绘制切片(键以某种调色板排列)。在按住Shift的同时按下其中一个按钮会突出显示该颜色的图块。我不能要求更自然的控制方案。

令人遗憾的是,Shift再一次给了我一些问题(上次我遇到Shift问题时,我获得了Tumbleweed徽章)。虽然这次,问题或多或少是Caps Lock,它通过反转功能完全搞砸了我的程序。

如何使用curses检测Python中Caps Lock的状态?

编辑:如果你打算建议使用一个单独的模块,我可能应该提醒你,curses--因此我的程序 - 在UNIX领域。

2 个答案:

答案 0 :(得分: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标志。如果它打开则为1,如果打开则为0。

Python可以使用仅限Linux的commands模块运行UNIX系统命令。命令似乎不会干扰诅咒。

>>> 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 :(得分:3)

简短的回答:你不能。

更长的答案:

curses被创建为基于terminfo的库,可以轻松创建独立于所使用终端的基于字符的UI(for terminal in 'vt220', 'wyse100', …)。

通过串行线连接的这些终端和来回往返主机的通信是通过纯文本(由用户输入或由主机输出)或特殊序列(“转义”序列;如果用户输入的话按下特殊键,如上一页,或者如果请求了光标定位或屏幕清除等特殊操作,则由主机输出。

我不知道任何哑终端在按下Caps Lock键时发送特殊序列,或者主机查询Caps Lock状态;锁定首都是终端工作的一部分,主持人不需要任何知识。这类似于当您自己按下Control键时无法使用curses程序的原因。

关于诅咒的一切都与terminfo能力有关;你问的问题没有任何相关的能力。