如何将()和input()同时打印到单个控制台而不会相互干扰?

时间:2018-03-07 21:14:29

标签: multithreading python-3.x terminal io python-curses

我有两个线程,一个以特定的时间间隔注册到控制台信息,一个在无限的while循环中从同一个控制台接收用户输入

from threading import Thread
import time

WHITE =  '\033[97m'    # User Input color
YELLOW = '\033[93m'    # Log output color
BLUE =   '\033[94m'    # Input prompt color
CYAN =   '\033[96m'    # Input result color

def logging():
    while True:
        # DO SOMETHING TO CREATE THE "Log text"
        print(YELLOW + "[{}] Log text".format(time.strftime('%X')) + WHITE)
        time.sleep(2)

def inputing():
    while True:
        userInput = input(BLUE + "Enter your input > " + WHITE)
        # DO SOMETHING WITH userInput
        print(CYAN + "Displaying result computed for input = '{}'".format(userInput) + WHITE)

logging_thread = (Thread(target=logging, args=( )))
logging_thread.start()

input_thread = (Thread(target=inputing, args=( )))
input_thread.start()

日志记录线程的输出继续中断我的用户输入,如下所示:gif of my console

我已尝试使用'\r'对上述代码进行修改,然后返回到开头,然后使用'\033[K'将该行删除为相对更干净的黑客,但这导致了我的用户输入也被删除了。代码是这样的:

ERASE_LINE = '\r' + '\033[K'

def logging():
    while True:
        # DO SOMETHING TO CREATE THE "Log text"
        print(ERASE_LINE + YELLOW + "[{}] Log text".format(time.strftime('%X')) + WHITE)
        print(BLUE + "Enter your input >" + WHITE, end = ' ', flush=True)
        time.sleep(2)

这样的输出如下:gif of my console for modified version

我尝试了this question的各种选项,但所有这些选项都用于单线程进程,其中input()和print()是串联的。

我正在寻找一种更清洁的解决方案,让他们两个并行工作。有没有办法在按下返回键之前存储用户已键入的字符,或者是否可以实现任何其他方法以使两个线程在同一控制台上协调工作?

0 个答案:

没有答案