Python Реализация init_pair Curses не соответствует документации - PullRequest
0 голосов
/ 13 июля 2020

Я экспериментировал с цветами Curses и столкнулся с небольшой проблемой.

Как указано в документации init_pair, первый аргумент (номер пары) должен быть между 1 и curses.COLOR_PAIRS - 1. Выполнение print(curses.COLOR, curses.COLOR_PAIR) дает 256 65536, поэтому можно подумать, что вызов courses.init_pair(40000, 1, 53) (случайный пример) будет работать, но вместо этого я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "4-colors.py", line 38, in <module>
    curses.wrapper(main)
  File "/usr/lib/python3.8/curses/__init__.py", line 105, in wrapper
    return func(stdscr, *args, **kwds)
  File "4-colors.py", line 18, in main
    curses.init_pair(40000, 1, 53)
OverflowError: signed short integer is greater than maximum

Конечно, реализация init_color (надеюсь, что я смотрю нужный файл) проверяет, находится ли номер пары цветов в границах короткого знака со знаком.

Почему? Есть ли способ обойти это и использовать все цвета моего терминала, а не только произвольную половину?

Полный исходный код MWE:

import curses

def main(window):
    curses.start_color()
    curses.use_default_colors()

    curses.init_pair(40000, 1, 53)

curses.wrapper(main)

1 Ответ

1 голос
/ 13 июля 2020

Проблема в том, что привязка curses Python не была обновлена ​​для учета изменений, сделанных в ncurses 6.1 : до этого момента значения возможностей (числа) переданы в / из библиотеки curses были ограничены 16-битным числом со знаком. ncurses 6.1 расширил, что, хотя для эффективного использования таких вещей, как COLOR_PAIRS, необходимо использовать одно из расширений функций, представленных в ncurses 6.1

, например, в данном примере вместо вызова init_pair, прототипом которого C является

int init_pair(short pair, short f, short b);

можно использовать init_extended_pair:

int init_extended_pair(int pair, int f, int b);

Конечно, это всегда был случай, когда приложения несут ответственность за проверку номеров, с которыми они имеют дело. Показанный пример иллюстрирует исключение времени выполнения Python (а не, например, ограничение количества цветовых пар, видимых вызывающими абонентами).

...