Python 如何在使用键盘模块时清除输入?

Python 如何在使用键盘模块时清除输入?,python,input,python-keyboard,Python,Input,Python Keyboard,我正在用Python和库键盘编写一个基于文本的游戏。 在代码的某一点上,我必须收集一个通过以下代码得到的数字: if menu == "test": try: x = int(input("Enter a Number: ")) except ValueError: print("Please input integer only...") 但要将菜单设置为“测试”,我必须使用键盘键入2

我正在用Python和库
键盘
编写一个基于文本的游戏。
在代码的某一点上,我必须收集一个通过以下代码得到的数字:

if menu == "test":
    try:
        x = int(input("Enter a Number: "))
    except ValueError:
        print("Please input integer only...")
但要将菜单设置为“测试”,我必须使用键盘键入2 1。 我的问题是,虽然菜单不是“测试”,但输入已经被收集。 运行代码时,我得到以下信息:

Enter a Number: 211
我可以很容易地在命令提示符下删除211,然后键入一些内容 但我希望它自动删除自己,这样我就可以:

Enter a Number:
我已经尝试过的:

input().clear()

input(None)

x = 0

#import os   --at the beginning of the code

os.system("clear")

如果要避免在终端中显示输出,可以在MacOS和Linux上使用以下选项:

导入系统 进口tty 进口术语 def隐藏_输入(*参数): stdin=sys.stdin.fileno() tattr=termios.tcgetattr(stdin) 尝试: tty.setcbreak(标准输入,终端输出) 返回输入(*args) 最后: termios.tcsetattr(stdin、termios.TCSANOW、tattr)
这是通过将TTY(终端仿真器99%的时间)设置为cbreak模式来实现的。以下是:

Enter a Number: 211
传统的“原始”模式更容易解释;它根本不在内核中处理输入或输出。键入时立即返回所有字符,并按原样生成所有输出。传统的“cbreak”模式用于密码输入等内容;它在键入字符时立即返回字符,不回显字符,并且不进行任何内核行编辑(这主要意味着您的程序实际上可以看到各种编辑字符)。在高层次上,“cbreak”和“raw”之间有两个主要区别。首先,cbreak保持输出处理不变,这可能是相对“熟的”。第二,cbreak仍然允许您使用^C中断程序,挂起程序,等等。您可以在大多数请求密码的程序(如passwd、su或sudo)中看到这一点;您可以立即用^C中断它们,例如vi不响应

cbreak的低电平设置为:

  • 禁用回波;这将阻止键入的字符被回显
  • 禁用ICANON;这将关闭行编辑。 将VMIN设置为1,VTIME设置为0;这使得read()在(至少)有一个字符可用时立即返回
请注意,由于
readline
仍在使用中,您仍可以像正常情况一样编辑键入的行

在Windows上,我不知道如何轻松地做到这一点

如果要清除用户按enter键后键入的输入,这会有点困难,因为需要部分清除已打印的输出,这需要使用特殊的控制代码

一个可能更简单的Windows解决方案:以下内容将清除MacOS和Linux上的整个终端,但也将在中工作(与默认的cmd.exe不同!)

print('\x1b[2J')

正如martineau评论中所建议的,您也可以尝试通过软件包将其用于普通Windows终端。

我认为我的目标有点不明确,所以我还编写了在已经显示的部分之前的代码(但简化了)

menu4中的输入会记住我以前键入的所有内容(211) 但是我不想要它,输入已经是211了,不是什么都没有,因为我输入了211 但我不希望它是什么,当谈到菜单4它不是我试图知道我以前键入了什么

当我运行我想要的代码时,应该发生以下情况:

# menu = "menu1"
# programm does sth and waits for input
# user presses "2"
# menu = "menu2"
# programm does sth and waits for input
# user presses "1"
# menu = "menu3"
# programm does sth and waits for input
# user presses "1"
# menu = "menu4" 

# programm prints the following:

# Enter a Number:   <--here is a EMPTY space where you can write sth.

# Please input integer only...           #(eventually)
#menu=“menu1”
#程序做某事并等待输入
#用户按“2”
#menu=“menu2”
#程序做某事并等待输入
#用户按“1”
#menu=“menu3”
#程序做某事并等待输入
#用户按“1”
#menu=“menu4”
#programm打印以下内容:

#输入一个数字:您想做的是终端功能,而不是键盘功能-因此,您使用的是第三方
键盘
模块这一事实与此无关。如果终端支持ANSI转义序列(或者您还安装了类似模块的东西),您可能可以通过使用ANSI转义序列来完成所需的操作。你想在删除之前显示这些数字吗?好的,谢谢。我会很快试用,并告诉你它是否有用。即使它不能解决我的问题(或者我不明白你想说什么),语法:print('\x1b[2J')对其他事情也很有帮助。
# programm prints the following:

# Enter a Number: 211   <--here it is NOT EMPTY

# Please input integer only...           #(eventually)