Можно ли использовать getch () для получения входных данных различной длины? - PullRequest
3 голосов
/ 05 сентября 2011

Я предпринял приключение по созданию сравнительно небольшой RPG для командной строки, чтобы напрячь мои вновь обретенные мускулы Python, но я уже столкнулся с головоломкой. Я использую эту реализацию getch ():

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

У меня есть key для чтения 3 символов для захвата клавиш со стрелками. Up, например, читается как ESC[A; с помощью этого метода я могу использовать key[2], чтобы определить, была ли нажата клавиша со стрелкой и какая. Все хорошо, за исключением того, что я также хотел бы захватывать все виды других ключей; q для журнала квестов, wasd для движения (нажатием стрелок в разных порядках будет метод атаки) и многие другие. Проблема сразу проясняется; если getch() возвращает только один символ, функциональность стрелки полностью теряется.

Я обдумываю переосмысление системы стрел, если нет простого решения, но я почти уверен, что так и должно быть. Конечно, я мало что знаю о том, что происходит в tty, но я где-то читал, что если вы читаете только 1 символ, лишние символы из нажатия на стрелку сохраняются в буфере. Как я могу получить доступ к указанному буферу? В качестве альтернативы, есть ли какой-нибудь умный способ сказать stdin ожидать ввода переменной длины?

Заранее благодарю за любую помощь.

Ответы [ 2 ]

5 голосов
/ 05 сентября 2011

не читайте три символа.Прочитайте один.

Если вы только что прочитали один символ ESC, прочитайте другой символ или два, чтобы увидеть, была ли это клавиша со стрелкой или что-то еще.Если это был q, сделайте это для этого и начните сначала.

0 голосов
/ 05 августа 2013

Если вы подумываете о разработке полной игры, PyGame также может быть полезным (в конечном итоге ncurses).

Фрагмент getch() можно обновить для чтения клавиши со стрелкой, но как отличить первый символ клавиши со стрелкой от клавиши ESC? Если пользователь нажмет ESC, описанное решение, вероятно, будет ожидать следующего нажатия клавиши.

Я не нашел никакого решения для обработки этого последнего случая.

...