Как изменить цвет определенного слова пользователя в «input()»

Наверное, в каждом редакторе кода есть такая функция: когда набираешь допустимое слово «класс», оно выделяется другим цветом. Можно ли сделать это в консоли с помощью «input()»? Пользователь записывает любое слово как один и тот же «класс», и оно выделяется каким-то цветом в консоли, и все это во время ввода.

Я знаю способ объединить весь ввод в одно целое, но мне нужно перерисовать лишь некоторые слова, которые набирает пользователь.

Для этого нужна расширенная библиотека, такая как проклятия. Это невозможно сделать с помощью простой функции input.

Michael Butscher 28.07.2024 18:50

@MichaelButscher, хорошо, но ты знаешь, как это сделать с помощью альтернативной функции input. Есть ли замена простого input в ругательствах?

Vagif 28.07.2024 18:56
input по сути является просто оберткой вокруг sys.stdin.readline. curses обеспечивает контроль над самим терминалом.
chepner 28.07.2024 22:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя вы можете изменить цвета в терминале с помощью такой библиотеки, как curses или termcolor, это сложнее, чем базовая функция input, предоставляемая Python.

У меня есть для вас пример использования 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)

В результате получается результат, подобный следующему изображению:

Дайте знать, если у вас появятся вопросы.

попробую сделать поддержку backspace key сама. Спасибо!

Vagif 29.07.2024 09:42

Другие вопросы по теме

Похожие вопросы

C-расширение Python с numpy случайно аварийно завершает работу после нескольких вызовов (5–10) из кода Python
Создайте фабрику виджетов в Qt
Почему GEKKO не предоставляет оптимальные команды, хотя выходные данные не соответствуют эталонным?
Java sshtools сгенерировал подпись EDDSA, не совпадающую с сгенерированной подписью пикриптома Python
Как записать атрибуты каждого экземпляра в переменную класса, при этом родительский класс записывает экземпляры всех классов в одну и ту же переменную?
Создание динамического массива numpy с использованием двух существующих массивов
Функция C++ возвращает результат очень медленно, намного медленнее, чем функционально эквивалентный код Python
Добавление переменного отступа перед каждой строкой вывода журнала Python
Как извлечь регулярное выражение с переменной из строки в пандах?
Создайте PyObject с указателем на функцию C