我正在使用
Python curses并尝试使用curses.init_color()初始化一种新颜色.即使在初始化新的RGB值并将其分配给一对之后,更改也不会生效.
我的终端支持颜色更改,因为curses.can_change_color()返回True.我还使用curses.color_content()检查了我更改的颜色索引 – 它返回了我在init_color()中指定的RGB值.我在开始时也调用过curses.start_color().
我错过了什么吗?我需要做什么才能在init_color()中进行更改?代码如下:
curses.start_color()
curses.init_color(17, 200,200,200)
curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(4, 17, curses.COLOR_BLACK)
print curses.can_change_color() #returns True
print curses.color_content(17) #(200,200,200),
stdscr.addstr("test",curses.color_pair(4)) #yet this text is blue
我错过了什么吗?
最佳答案 你的颜色太暗了.尝试另一种更亮的颜色,例如(800,800,0)看黄色.
作为documentation states,每个RGB分量可以在0到1000之间变化,因此如果我们将(200,200,200)颜色映射到标准的8位方案,我们得到类似于http://colorpeek.com/#rgb(51,51,51)的东西.
您可以运行此演示,并看到init_color,init_pair和任何其他函数按预期工作.首先它打印8种颜色,同时仅在值0和200之间改变每个组件.然后当组件在范围内变化时,它会打印更完整的调色板(0,200,400,600,800,1000)
# -*- coding: utf-8 -*-
import curses
def demo(screen):
# save the colors and restore it later
save_colors = [curses.color_content(i) for i in range(curses.COLORS)]
curses.curs_set(0)
curses.start_color()
# use 250 to not interfere with tests later
curses.init_color(250, 1000, 0, 0)
curses.init_pair(250, 250, curses.COLOR_BLACK)
curses.init_color(251, 0, 1000, 0)
curses.init_pair(251, 251, curses.COLOR_BLACK)
screen.addstr(0, 20, 'Test colors for r,g,b = {0, 200}\n',
curses.color_pair(250) | curses.A_BOLD | curses.A_UNDERLINE)
i = 0
for r in (0, 200):
for g in (0, 200):
for b in (0, 200):
i += 1
curses.init_color(i, r, g, b)
curses.init_pair(i, i, curses.COLOR_BLACK)
screen.addstr('{},{},{} '.format(r, g, b), curses.color_pair(i))
screen.addstr(3, 20, 'Test colors for r,g,b = {0..1000}\n',
curses.color_pair(251) | curses.A_BOLD | curses.A_UNDERLINE)
for r in range(0, 1001, 200):
for g in range(0, 1001, 200):
for b in range(0, 1001, 200):
i += 1
curses.init_color(i, r, g, b)
curses.init_pair(i, i, curses.COLOR_BLACK)
# screen.addstr('{},{},{} '.format(r, g, b), curses.color_pair(i))
screen.addstr('test ', curses.color_pair(i))
screen.getch()
# restore colors
for i in range(curses.COLORS):
curses.init_color(i, *save_colors[i])
if __name__ == '__main__':
curses.wrapper(demo)
此外,当您使用init_color更改颜色时,请确保在退出程序之前还原它们,因为即使退出curses程序(color not ended in curses),当前会话中的终端颜色也无法恢复.