一次读取和打印一个字符-Python中的getche()和退格键

时间:2019-07-05 16:03:08

标签: python python-3.x character backspace getch

我想创建打字训练程序。我需要一个可以立即读取并打印用户击中的每个字符的函数-类似于getche()

我尝试使用this module中的getche,但是它不能很好地处理退格键。当我按下退格键时,它会打印^?到控制台,我希望它删除字符。

2 个答案:

答案 0 :(得分:1)

docs很清楚。

  

尝试使用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

答案 1 :(得分:1)

curses documentation page官方的定义是:

  

curses模块提供了curses库的接口,curses库是便携式高级终端处理的实际标准。

您说过您想编写一个打字训练程序,我认为最好的解决方案是使用curses库执行此任务。

在UNIX系统上,它带有python的默认安装,并且如果您是针对Windows系统的,我发现windows-curses大大增加了支持。

基本上,您可以从官方文档this页中找到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

您可以使用此库执行许多操作,建议您继续阅读我提供的链接上的文档。