Чтение и печать по одному символу за раз - getche () и backspace в Python - PullRequest
2 голосов
/ 05 июля 2019

Я хочу создать программу обучения печатанию. Мне нужна функция, которая сразу же читает и печатает каждый удар пользователя - что-то вроде getche ()

Я пытался использовать getche из этого модуля , но он плохо справляется с возвратами. Когда я нажимаю клавишу Backspace, она печатает ^? в консоль, и я хочу, чтобы удалить символы.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

На официальной странице документации curses его определение:

Модуль curses предоставляет интерфейс для библиотеки curses, фактического стандарта для портативной расширенной обработки терминала.

Вы сказали, что хотите написать программу обучения печатанию , и я думаю, что лучшим решением будет использование библиотеки curses для такой задачи.

В системах UNIX он поставляется с установленной по умолчанию установкой python, и если вы ориентируетесь на системы Windows, я обнаружил windows-curses , чтобы значительно увеличить поддержку.

В основном выВы можете найти руководство по HOWTO на этой странице из официальных документов .

Вот пример использования для создания виджета для текстового поля

Модуль curses.textpad должен быть очень полезным для вас.

import curses
from curses import wrapper
from curses.textpad import Textbox, rectangle

def main(stdscr):   
    stdscr.addstr(0, 0, "Enter IM message: (hit Ctrl-G to send)")

    editwin = curses.newwin(5,30, 2,1)
    rectangle(stdscr, 1,0, 1+5+1, 1+30+1)
    stdscr.refresh()

    box = Textbox(editwin)

    # Let the user edit until Ctrl-G is struck.
    box.edit()

    # Get resulting contents
    message = box.gather()
    print(message)

if __name__ == '__main__':
    wrapper(main)

Вот как это выглядит при использовании модуля windows-curses

Curses example screenshot

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

1 голос
/ 05 июля 2019

Документы довольно ясны.

пробовал использовать getche

Не делайте этого, поскольку документально подтверждено, что getche() имеетповедение, которое, как вы говорите, вам не нужно.

Позвоните getch() и возьмите на себя ответственность за "отображение" или иное обслуживание дисплея в соответствии с вашими требованиями.

Например, этот кодвыполняет то, что вы хотите:

from getch import getch


def pr(s):
    print(s, end='', flush=True)


def get_word():
    DELETE = 127  # ASCII code
    word = ''
    c = ''
    while not c.isspace():
        c = getch()
        if ord(c) == DELETE:
            pr('\r' + ' ' * len(word) + '\r')
            word = word[:-1]
            pr(word)
        if c.isprintable():
            word += c
            pr(c)
    print('\n')
    return word
...