如何在“input()”中更改用户特定单词的颜色

问题描述 投票:0回答:1

可能在每个代码编辑器中都有这样的功能,当您键入有效单词“class”时,它会以另一种颜色突出显示。是否可以在控制台中使用“input()”来执行此操作?用户将任何单词写为相同的“类”,并且在输入过程中,它会在控制台中以某种颜色突出显示。

我知道一种方法可以一次性完成所有输入,但我需要重新绘制用户正在输入的一些单词。

python colors colorama termcolor
1个回答
0
投票

虽然您可以使用

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)

产生如下图所示的输出:

sample image showing class and def highlighted using curses

如果您有任何疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.