Python 3.4: getch() — пишущая машинка — Python

Главный вопрос о том, как построена моя программа на Python, я пытаюсь создать пишущую машинку для своей программы, которая при нажатии клавиши обновляется как графический интерфейс. Однако я столкнулся со странной проблемой с ASCII, особенно с Backspace.

from msvcrt import getch
import os
#Test
# Always run in Python CMD
myinput = ""
Finished = False
while Finished != True:
    os.system('cls')
    print("Name: " + myinput)
    while True:
        key = ord(getch())
        realkey = chr(key)
        print(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
                break
            else:
                myinput = myinput + realkey
                break

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

P
>Name: P
y
>Name: Py
t
>Name: Pyt
h
>Name: Pyth
o
>Name: Pytho
n
>Name: Python
(Backspace)
>Name: Python
(Backspace)
>Name: Python
(Backspace)
>Name: Python
K
>Name: PytKon
#See?!    |

Почему? и как я могу исправить эту ошибку? Есть ли более чистый способ делать то, что я делаю? Но это должно быть сделано в стиле графического интерфейса, который я сделал. (Если это имеет смысл)

Кроме того, я знаю, что этот getch() должен фиксировать все, что я печатаю, но есть ли способ фиксировать только правильные символы (в основном я хочу, чтобы моя пишущая машинка была похожа на input() ) без необходимости проверки каждого недопустимого символа?

Спасибо.


person user3412975    schedule 30.03.2016    source источник
comment
без необходимости обусловливать каждый недопустимый символ, тогда, может быть, вы можете обусловить все допустимые символы? if inp in legal_chars: do stuff?   -  person Bahrom    schedule 30.03.2016


Ответы (1)


Я предполагаю, что вы используете библиотеку curses. Если да, вы можете использовать from curses import ascii для получения значений символов ASCII. В этом случае вы можете использовать ascii.DEL, чтобы получить значение клавиши возврата: 127. Клавиша возврата часто записывается как \b. Просто попробуйте ввести print("foo\b\b") в оболочку Python. Вы увидите, что напечатана вся строка. Однако если вы сделаете print("foo\b\bf"), будет напечатано ffo. Это потому, что символ \b просто перемещает курсор влево на один символ. На самом деле он не перезаписывает символы пробелами, чтобы удалить их с экрана. Вам нужно рассматривать символ возврата как особый:

myinput = ""
Finished = False
while Finished != True:
    os.system('cls')
    print("Name: " + myinput)
    while True:
        key = ord(getch())
        realkey = chr(key)
        print(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
            elif key == ascii.DEL:
                myinput = myinput[:-1]
            else:
                myinput += realkey
            break

Изменить: Фактический код, используемый OP:

from msvcrt import getch
import os

Finished = False
mydict = "" ## my_dict has no special value, just decided to call it that.

while Finished != True:
    while True:
        key = ord(getch())
        realkey = chr(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
                break
            elif key == 8: #Backspace
                my_dict[CurrentItem] = my_dict[CurrentItem][:-1]
                break
            elif key in range(32, 127):
                my_dict[CurrentItem] += realkey
                break
person zondo    schedule 30.03.2016
comment
Спасибо, zondo, мне больше всего помогло то, что вы упомянули, что со специальными символами нужно обращаться как со специальными символами. Я исправил проблему с возвратом, но не использую модули curses. Я пытался познакомиться с модулем curses в совершенно другом файле py, однако он делает мою структуру, подобную графическому интерфейсу, бесполезной, поскольку это полностью собственная структура графического интерфейса. Есть ли способ предотвратить ввод недопустимых символов? ( Нравится ввод() ) Спасибо. Также я забыл добавить импорт в свой код выше, поэтому я внес изменения. - person user3412975; 31.03.2016
comment
Вот таблица кодов ascii. Вы можете решить, что должно быть разрешено, исходя из этого. Вы можете, например, сказать, что это должно быть в range(32, 128), потому что это печатные символы (включая удаление), которые есть на средней клавиатуре. Возможно, вы захотите использовать range(32, 256), чтобы включить символы, которые можно напечатать, но которых нет на обычной клавиатуре. Возможно, вы захотите добавить 10 отдельно, потому что это символ новой строки. Может быть, вы хотите добавить особое поведение для Escape, 27. - person zondo; 31.03.2016