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