LINUX.ORG.RU

Python curses и специальные клавиши

 ,


0

1

Здравствуйте, коллеги!

curses - действительно проклятья…

Делаю простенькую менюшку. Перемещение по пунктам клавишами: KEY_UP, KEY_DOWN и выход ESC.

Вот тут я в растерянности.

https://dvmn.org/encyclopedia/modules/curses/

Чтобы получить ввод от пользователя в Curses есть три метода: canvas.getch() — обновляет холст и ждёт, когда пользователь нажмёт на кнопку. Возвращает ASCII-код нажатой клавиши. canvas.getkey() — тоже ждёт ввода пользователя. На этот раз вернёт сам нажатый символ. Нажатия на специальные клавиши перехватятся с помощью, например, curses.KEY_HOME или curses.KEY_LEFT.

Все четко и понятно:

i = win.getkey()
if i == curses.KEY_UP: win.addstr(18, 2, 'KEY_UP')
if i == curses.KEY_DOWN: win.addstr(18, 2, KEY_DOWN')
if i == curses.KEY_CANCEL: break

но не работает!

Что я делаю не так?


win.keypad(1)
i = win.getkey()
if i == curses.KEY_UP: win.addstr(18, 2, 'KEY_UP')
if i == curses.KEY_DOWN: win.addstr(18, 2, KEY_DOWN')
if i == curses.KEY_CANCEL: break

После добавления win.keypad(1) специальные клавиши стали обрабатываться нормально. Вот только… Придется отказаться от Esc. При включенном win.keypad(1) esc идет как первый байт при нажатии специальных клавиш и считается, что должно быть продолжение из второго байта.

Вот, блин…

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 1)
Ответ на: комментарий от HighMan

use this Luke

The getch() method returns an integer; if it’s between 0 and 255, it represents the ASCII code of the key pressed. Values greater than 255 are special keys such as Page Up, Home, or the cursor keys. You can compare the value returned to constants such as curses.KEY_PPAGE, curses.KEY_HOME, or curses.KEY_LEFT.
Morin ★★★★★
()
Ответ на: комментарий от Morin

Хм…

Через

win.keypad(1)
i = win.getch()

Нормально отлавливаются curses.KEY_UP, curses.KEY_DOWN, но какие константы использовать для Enter и Esc?

curses.KEY_ENTER с нажатием Enter не бьется, как и curses.KEY_CHANCEL.

Заменил curses.KEY_ENTER на 10 и curses.KEY_CHANCEL на 27. Так работает нормально.

Видимо с точки зрения curses это нормально: часть кодов отлавливать по курсовым константам, а другую часть по целочисленным значениям.

HighMan
() автор топика