【问题标题】:Get STDIN before user hits enter key在用户按下回车键之前获取 STDIN
【发布时间】:2020-05-09 23:05:25
【问题描述】:

我对套接字编程和标准输入/标准输出比较陌生,我需要知道是否有办法在用户点击输入之前从标准输入获取输入。

例如,如果他们键入“F”但没有按回车键,我需要看到那个“F”。 我需要一个基本的聊天应用程序,我需要用户输入到下一行,这样我就可以在不破坏文本的情况下打印传入的消息。

我尝试在用户完成输入之前冻结 STDOUT,但这只是在代码到达输入代码块的那一刻冻结。

当前代码:

### Main Handle ###
def Handler():
    print("\nConnected.\n")
    print(f"{server.recv(1028).decode()}\n")
    def _send():
        while True:
            sys.stdout = buffer = io.StringIO()
            text = input()
            sys.stdout = old_stdout
            print(buffer.getvalue())
            try:
                server.sendall(text.encode())
            except:
                pass

    def _get():
        while True:
            print(stdin)
            try:
                message = server.recv(1028).decode()
                if message == "":
                    print("\nYou got disconnected from the server, sorry bud. :C")
                    break
            except ConnectionResetError:
                print("\nYou got disconnected from the server, sorry bud. :C")
                break
            print(f"\n{message}")

    _gthread = Thread(target = _get)
    _gthread.start()
    _sthread = Thread(target = _send)
    _sthread.start()
    while True:
        pass

非常感谢任何帮助。 :)

【问题讨论】:

  • 您可能可以使用类似 pynput 的东西来抓取按键,而不是使用标准输入。听起来您正在监听按键,除了标准输入之外还有其他方法可以做到这一点

标签: python python-3.x sockets stdin


【解决方案1】:

shell 或终端仿真器,或两者都要求,作为其启动序列的一部分,将终端置于“cooked”模式,该模式会缓冲输入,直到看到新行。这种缓冲发生在终端驱动程序中,甚至在它到达您的程序之前,这就是为什么您的程序不会在标准输入中看到单个字符的原因。

您需要让您的程序将终端置于原始(未煮过的)模式,或不进行缓冲的原始模式的变体。

Python example.

请注意,在“真实”原始模式下,CTRL+C 和朋友不起作用,因此您可能不想要tty.setraw(),而是想要tty.setcbreak()

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 2016-04-05
    • 1970-01-01
    • 2011-12-31
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多