Цвета в проклятиях

75
6

Я пытаюсь добавить цвета в мой проклятый вывод. Однако проблема заключается в том, что текст печатается с помощью одной длинной строки, то есть self.all_results. Есть ли способ добавить цвет в одну часть строки.

def main(self,stdscr):
x,y = 0,0 # size of the window
xx,yy = 50,200 # where to place window - up,across
pad = curses.newpad(150,150) # nlines, ncols
pad_pos = 0
exit = False

pad.addstr(4,0,str(self.all_results))

while not exit:
sleep(0.2)
if self.timer != None:
if time() - start > self.timer:
self.stop = True
break

pad.addstr(0,0,str(self.format_results()))
pad.refresh(pad_pos,0, x,y, xx,yy)

cmd = stdscr.getch()
stdscr.nodelay(1)

if cmd != -1:
pad.refresh(pad_pos,0, x,y, xx,yy)
if len(self.format_results().split('\n')) > 100:
if cmd == curses.KEY_DOWN:
if pad_pos < len(self.format_results())+1:
pad_pos += 1
try:
pad.refresh(pad_pos,0, x,y, xx,yy)
except curses.error:
pass
elif cmd == curses.KEY_UP:
if pad_pos != 0:
pad_pos -= 1
try:
pad.refresh(pad_pos,0, x,y, xx,yy)
except curses.error:
pass

спросил(а) 2021-01-19T13:44:06+03:00 2 месяца, 4 недели назад
1
Решение
63

Я бы использовал re чтобы разбить строку вверх, а затем использовать non- x,y форму addstr, addstr цвет для каждой части.

#!/usr/bin/env python
import curses
from curses.wrapper import wrapper
import re

def addstr_colorized(win, y, x, s):
colors = {'OK': curses.COLOR_GREEN, 'ERROR': curses.COLOR_RED}
win.move(y, x)
pattern = r'({0:s})'.format(
'|'.join(r'\b{0:s}\b'.format(word) for word in colors.keys()))
s = re.split(pattern, s)
for s in s:
win.addstr(s, curses.color_pair(colors.get(s, 0)))

def main(stdscr):
curses.init_pair(curses.COLOR_RED,
curses.COLOR_RED,
curses.COLOR_BLACK)
curses.init_pair(curses.COLOR_GREEN,
curses.COLOR_GREEN,
curses.COLOR_BLACK)

addstr_colorized(stdscr,
4,
0,
"This line is OK.\nBut there is an ERROR in this line\n")
stdscr.refresh()
stdscr.getch()

wrapper(main)

enter image description here

ответил(а) 2021-01-19T13:44:06+03:00 2 месяца, 4 недели назад
44

Это то, что я использовал для этого (не слишком красивое, но это было хорошо для того, что я делал).

Вы просто определяете свои цветовые пары где-то, а именно:

curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_GREEN);

Затем просто вызовите функцию с сообщением, содержащим colourN [str], где N - цветовая пара num, а str - часть строки, которую вы хотите покрасить.

Например:

addStrColour(stdscr, 0, "This is an example message, colour1[This is coloured using colour pair 1!!!] and now we have normal text again");

Это функция:

def addstrColour(stdscr, pos, message):
#Split messages based on colour components
newMes = re.split("(colour\d\[.*?\])", message);

totalOut = 0;

for line in newMes:
m = re.match("colour(\d{1})\[(.*)\]", line);
if m:
colourPairNum = int((m.groups()[0]));

stdscr.addstr(pos, totalOut, m.groups()[1], curses.color_pair(colourPairNum));
totalOut += len(m.groups()[1]);
else:
stdscr.addstr(pos, totalOut, line);
totalOut += len(line);

ответил(а) 2021-01-19T13:44:06+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема