Я удивлен, что по такому простому вопросу я ничего не нашел с помощью поиска ...

В любом случае, я сделал приложение curses на Python, которое помогает решать головоломки определенной игры DSiWare. С его помощью вы можете взять пазл и осматривать его компоненты по отдельности. Клавиши qweasdzx используются для раскрашивания плиток (клавиши расположены в виде какой-то палитры). Нажатие одной из этих клавиш, удерживая Shift, выделяет плитки этого цвета. Я не мог и мечтать о более естественной схеме управления.

Так что жаль, что Shift снова вызывает у меня проблемы (в прошлый раз, когда у меня были проблемы с Shift, я получил значок Tumbleweed). Хотя на этот раз проблема в большей или меньшей степени в Caps Lock, который полностью портит мою программу, меняя ее функции.

Как я могу определить состояние Caps Lock в Python с помощью curses?

РЕДАКТИРОВАТЬ: Если вы собираетесь предложить использовать отдельный модуль, я, вероятно, должен напомнить вам, что curses - и, следовательно, моя программа - находится на территории UNIX.

4
Exp HP 8 Июл 2010 в 23:06

2 ответа

Лучший ответ

Я нашел решение самостоятельно:

Поскольку curses совершенно не осведомлен о настройке Caps Lock согласно ΩΤΖΙΟΥ, я попробовал альтернативное решение. В частности, я посмотрел, как проверить Caps Lock в сценарии BASH. Я обнаружил следующее:

Только Linux. Требуется X Window System.

$ xset q | grep LED
>  auto repeat:  on    key click percent:  0    LED mask:  00000000

Последний 0 в этом выводе (66-й символ в строке) - это флаг Caps Lock. 1, если он включен, 0, если он выключен.

Python может запускать системные команды 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-совместимое решение.

Я собираюсь пока принять этот самоответчик, но если кто-то другой может предложить лучшее рабочее решение, я бы хотел его увидеть.

7
Exp HP 12 Июл 2010 в 00:41

Короткий ответ: нельзя.

Более длинный ответ:

Curses был создан как библиотека на основе terminfo, чтобы упростить создание пользовательских интерфейсов на основе символов, независимо от используемого терминала (for terminal in 'vt220', 'wyse100', …).

Эти терминалы, подключенные через последовательную линию, и обмен данными между хостом осуществлялись либо посредством обычного текста (вводимый пользователем или выводимый хостом), либо посредством специальных последовательностей («escape-последовательности»; вводимые пользователем, если были специальные клавиши нажата, например или Prev , или выводится хостом, если были запрошены специальные операции, такие как позиционирование курсора или очистка экрана).

Я ничего не знаю о каких-либо терминалах, отправляющих специальную последовательность при нажатии клавиши Caps Lock, или о том, что хост запрашивает статус Caps Lock; блокировка капиталов была частью работы терминала, и хост не нуждался в каких-либо знаниях. Это похоже на причину, по которой у вас не может работать программа curses, когда клавиша Control нажата сама по себе.

Все, что касается проклятий, связано с возможностями terminfo; нет никаких связанных возможностей для того, о чем вы просите.

3
tzot 8 Июл 2010 в 23:33