如何在python中接受输入时实时更改某些单词的颜色

时间:2014-12-12 10:34:20

标签: python multithreading input colors

我正在尝试编写一段代码,它接受一个字符串作为输入,如果用户输入了一个特定的单词,它会将单词的颜色更改为红色,但实时所有我的意思是当用户输入字符串不是他按下Enter后。 我知道它应该通过线程来完成,但问题是我不知道如何使线程实时工作。 请问有人帮帮我吗?

1 个答案:

答案 0 :(得分:1)

以下是从标准时间读取一个字符的方法,取自this answer

class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()

getch = _Getch()

此代码的一种可能用法如下所示。您读取字符并将其存储在变量中。然后将其打印到stdout并按colorama为其着色。这段代码只是一个例子,它仍然有一件事不能正常工作:处理“空间”。但如果你尝试一下,你会看到这些单词是实时着色的。需要额外的调整才能实时正确输出所有字母,包括空格。但是我把它留给你,这足以让你开始。

import sys
from colorama import Fore

special_words = ['bannanas', 'eggs', 'ham']
my_text = ''
while True:
    c = getch()
    if ord(c) == 13:  # newline, stop
        break 
    my_text += c    

    sys.stdout.write("\r")  # move to the line beginning
    for word in my_text.split():
        if word in special_words:
            sys.stdout.write(Fore.RED + word + " ")
        else:
            sys.stdout.write(Fore.RESET + word + " ")
    sys.stdout.flush()

# reset the color when done
print(Fore.RESET)