按escape键时取消输入

2024-09-22 16:34:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个类似input()的函数,但是当按下Esc键时,它会返回None(例如)。在

我试着做以下事情:

def input(t):
    print(t)
    text = ""
    while True:
        char = msvcrt.getche();

        if char == chr(27).encode():
            return None

        if char == b'\r':
            return text

        try:
            text += char.decode()
        except:
            pass

这在很大程度上是可行的,但问题是退格键不起作用,而且当我按下箭头键之类的非字符键或组合键时会出现奇怪的字符。所以getche可能不是我问题的答案。在

我以为这是一个常见的问题,但我一直未能找到解决办法。在


Tags: 函数textnonetrueinputreturnifdef
2条回答

我用模块keyboard编写了一个代码。您可以使用pip install keyboard安装它。它显示left、right、end、home、enter、escape、backspace和许多其他键。
您可以使用函数read_input。它有两个选项textcanceltext是要打印的文本,cancel是将取消输入的键。如果按escape,则返回None,如果enter,则返回键入的文本。
代码如下:

def read_input(text="",cancel="esc"):
    import keyboard,string as t
    print(text,end="")
    output = []
    output2 = []
    allowed = t.ascii_letters+"1234567890!@#$%^&*()-=_+{}[]|\:;',<>./?`~"+'"'
    while True:
        key = keyboard.read_event()
        k = key.name
        if key.event_type == "up":continue
        if k == cancel:print("");return None
        elif k == "enter":break
        elif k == "end":output = output+output2;output2 = []
        elif k == "home":output2 = output+output2;output = []
        elif k == "left":
            try:output2.insert(0,output.pop())
            except:pass
        elif k == "right":
            try:output.append(output2.pop(0))
            except:pass
        elif k == "space":k = " ";output.append(k)
        elif k == "backspace":output = output[:-1]
        elif k in allowed:output.append(k)
    foutput2 = ""
    for put in output:
        foutput2 += str(put)
    for put in output2:
        foutput2 += str(put)
    for i in range(0,len(foutput2)+2):keyboard.press_and_release("backspace")
    print(foutput2)
    return foutput2

您可以像正常输入一样使用它:

^{pr2}$



另一方面也有一些问题。
它从整个窗口读取密钥,而不仅仅是python。
在第一秒输入的键(执行时)可以被忽略。在

下面是一个动画:
GIPHY

I was under the impression that this would be a common problem

不,不是的。说到io有两个常见的习惯用法。第一种被称为线导向。它可用于批处理模式的程序中,其中标准输入可重定向到文件或管道。在这种模式下,程序本身甚至不应该试图知道它是从一个真正的键盘还是从一个文件中读取(或多或少,密码输入是个例外)。低级驱动程序,或者输入库可以添加一些好东西,比如在线编辑(退格处理),但是程序员不能直接访问这些东西,而且在任何情况下都不打算是可移植的。在

第二种模式是GUI。在这里,大多数事情都是由程序员控制的:输入字段在屏幕上的位置、大小以及特殊字符的可选处理。更确切地说,它通常是通过一个图形库来处理的,比如tkinter(tk)、pyqt或pyside(Qt),或者。。。在

你所要求的是一种中庸之道。初学者尝试探索它是很常见的,但是过了一段时间,我们都意识到对于现实世界的程序来说,这两个常见的习惯用法就足够了。在

你可能会发现这个答案比技术性的更具哲理性,理论上,改进行式版本没有什么不好的,但在实际的程序中,我从来没有找到任何真正的理由来超越现有的。在

相关问题 更多 >