Python 如何在使用键盘模块时清除输入?
我正在用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
键盘编写一个基于文本的游戏。
在代码的某一点上,我必须收集一个通过以下代码得到的数字:
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)