Python curses не отображает цвета, тогда как C ncurses работает нормально

Кажется, я не могу заставить модуль Python curses отображать цвета, тогда как библиотека ncurses C работает нормально. Вот простой скрипт, который должен работать:

import curses

def main(stdscr):

  if not curses.has_colors(): raise
  stdscr.addstr("Hello world\n", curses.color_pair(curses.COLOR_RED))
  stdscr.addstr("Press any key to exit.\n")
  stdscr.refresh()
  while stdscr.getch() == -1: pass

if __name__ == '__main__':
  curses.wrapper(main)

Я вижу только «Нажмите любую клавишу, чтобы выйти». Я знаю, что "Hello world" пишется из-за новой строки, но я не вижу текста. Я пробовал разные пары цветов, но работает только 0, то есть белый.

Не используя обертку, т.е.

  stdscr = curses.initscr()
  curses.start_color()
  main(stdscr)
  curses.endwin()

Не помогло.

Я протестировал его на XTerm (312), у которого черный фон, и на urxvt v9.20, у которого белый. Я на Debian jessie, использую bash и Python 2.7.

Я запустил старый сценарий C, который у меня был, который использует ncurses и хорошо отображает цвета, поэтому я предполагаю, что либо я делаю что-то неправильно, либо что-то не так с библиотекой python. Я загрузил пакет под названием colortest-python, и он также смог отображать цвет, хотя для этого не использовал проклятия (только для проверки того, способен ли терминал отображать цвета).


person Alex    schedule 09.01.2015    source источник


Ответы (1)


вам нужно добавить следующие строки в начале, чтобы инициализировать цвета

curses.start_color()
curses.use_default_colors()

Затем вам нужно инициализировать пары цветов с помощью

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)

Это инициализирует первую пару, например, красным передним планом и белым фоном. После этого вы используете значение int, которое вы передаете в качестве первого аргумента функции, вместо curses.COLORS в curses.color_pair(), и цвета будут отображаться правильно.

person Álvaro Gómez    schedule 09.01.2015
comment
Не помогло. Полный сценарий. Другие цветовые пары тоже не работают - person Alex; 09.01.2015
comment
что выводит curses.has_colors()? - person Álvaro Gómez; 09.01.2015
comment
Ну, теперь я понял, вы не используете цвета напрямую, вам нужно объявить пару с curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE), а затем использовать значение int, которое вы используете в первом аргументе в curses .color_pair(1). Так должно работать - person Álvaro Gómez; 09.01.2015
comment
Это сработало, но разве эти цветовые пары не должны быть инициализированы оболочкой? В любом случае, вы можете добавить это как ответ, чтобы я мог принять его, если хотите. - person Alex; 09.01.2015
comment
Похоже, вы должны сделать это сами, а также - person Álvaro Gómez; 09.01.2015