可能在每个代码编辑器中都有这样的功能,当您键入有效单词“class”时,它会以另一种颜色突出显示。是否可以在控制台中使用“input()”来执行此操作?用户将任何单词写为相同的“类”,并且在输入过程中,它会在控制台中以某种颜色突出显示。
我知道一种方法可以一次性完成所有输入,但我需要重新绘制用户正在输入的一些单词。
虽然您可以使用
curses
等库来更改终端中的颜色,但这比 python 提供的基本 input
函数更具挑战性。
我在这里为您提供了一个使用
curses
的示例,但它可以在您自己的窗口(而不是终端)中更轻松地完成,例如使用 tkinter
或 python qt 库之一。
本质上,您需要读取用户的输入,查看它是否与您的任何特殊单词匹配,然后用彩色变体替换特殊单词。我这里的版本非常小,它不支持退格键,也不检查您的特殊单词是否被埋在更大的单词中等等,但如果您选择走这条路,可能足以让您开始.
import curses
RED_PAIR = 1
BLUE_PAIR = 2
def main(stdscr: curses.window):
# This must be called before you can initialize the colour pairs
curses.start_color()
# Choose a couple random colours
curses.init_pair(RED_PAIR, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(BLUE_PAIR, curses.COLOR_CYAN, curses.COLOR_BLACK)
# Create a lookup of all the special words that should be highlighted
special_words = {
'class': curses.color_pair(RED_PAIR),
'def': curses.color_pair(BLUE_PAIR)
}
# Clear the window
stdscr.clear()
# Look forever, which can exited using ctrl-c
while True:
# Refresh the screen
stdscr.refresh()
# Get the next user input
new_char = stdscr.getkey()
# Put that in the screen
stdscr.addstr(new_char)
# Refresh so that the cursor moves and the text is drawn to the screen
stdscr.refresh()
# Get the cursor position it can be reset after all these function calls
y, x = curses.getsyx()
# Check each special word, looking for a match
for special_word, colour_pair in special_words.items():
# First, check the length to make sure there is enough space
char_len = len(special_word)
if x < char_len:
# Not enough space for this word
continue
# Grab the characters to check
match_candidate = stdscr.instr(y, x - char_len, char_len).decode()
if match_candidate == special_word:
# There was a match, set the colour and add the text on top of it
stdscr.attron(colour_pair)
stdscr.addstr(y, x - char_len, special_word)
stdscr.attroff(colour_pair)
# Reset the cursor, all the above functions move it around
stdscr.move(y, x)
if __name__ == '__main__':
curses.wrapper(main)
产生如下图所示的输出:
如果您有任何疑问,请告诉我。