Наверное, в каждом редакторе кода есть такая функция: когда набираешь допустимое слово «класс», оно выделяется другим цветом. Можно ли сделать это в консоли с помощью «input()»? Пользователь записывает любое слово как один и тот же «класс», и оно выделяется каким-то цветом в консоли, и все это во время ввода.
Я знаю способ объединить весь ввод в одно целое, но мне нужно перерисовать лишь некоторые слова, которые набирает пользователь.
@MichaelButscher, хорошо, но ты знаешь, как это сделать с помощью альтернативной функции input. Есть ли замена простого input в ругательствах?
input по сути является просто оберткой вокруг sys.stdin.readline. curses обеспечивает контроль над самим терминалом.






Хотя вы можете изменить цвета в терминале с помощью такой библиотеки, как 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 сама. Спасибо!
Для этого нужна расширенная библиотека, такая как проклятия. Это невозможно сделать с помощью простой функции
input.