3

我想要一个像 一样工作的函数,但是在按下键时input()会返回None(例如) 。Esc

我尝试执行以下操作:

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

这在大多数情况下都有效,但问题是退格不起作用,并且在按下箭头键或组合Ctrl+等非字符键时会出现奇怪的字符C。所以 getche 可能不是我问题的答案。

我的印象是这将是一个常见问题,但我一直无法找到解决方案。

4

2 回答 2

1

我使用 module 做了一个代码keyboard。您使用pip install keyboard. 它读取左、右、结束、主页、输入、退出、退格和许多其他键。
你可以使用函数read_input。它有两个选项textcancel. text是要打印的文本,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

您可以像普通输入一样使用它:

print(read_input("Enter your name: "))



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

这是一个动画:
吉菲

于 2018-08-21T10:04:38.043 回答
1

我的印象是这将是一个普遍的问题

不它不是。关于 io 有两个常见的习语。首先称为面向线。它可以用于批处理模式程序,其中标准输入可以重定向到文件或管道。在这种模式下,程序本身甚至不应该尝试知道它是从真正的键盘读取还是从文件读取(或多或少,密码输入是例外)。低级驱动程序或输入库可以添加一些好东西,如行内编辑(退格处理),但这不是程序员直接访问的,并且无论如何都不是可移植的。

第二种模式用于 GUI。在这里,大部分事情都在程序员的控制之下:输入字段在屏幕上的位置、它们的大小,以及特殊字符的可选处理。更准确地说,它一般是通过图形库如 tkinter (tk)、pyqt 或 pyside (Qt) 进行处理,或者...

你要求的是一种中等的方式。初学者尝试探索它是很常见的,但一段时间后,我们都意识到对于现实世界的程序来说,这两个常见的习语就足够了。

您可能会发现这个答案比技术更具有哲学性,理论上改进行版本并没有什么坏处,但是在实际程序中,我从未找到任何真正的理由来超越当前可用的内容。

于 2018-08-21T14:29:54.503 回答