1

Я работаю над программой на Python с текстовым графическим интерфейсом на основе urwid. urwid - это библиотека для создания программ в стиле ncurses с python.

Операционная система - CentOS 7.

Все нормально работает в «нормальных» условиях (X-Server, окно терминала). Однако на консоли Linux без X-сервера urwid переключается в режим низкого цвета. (С неправильными цветовыми кодами на некоторых машинах я получаю раздражающе мигающий текст, чем)

Забавно, что при использовании консоли linux мне просто нужно запустить screen в качестве обходного пути. Внутри экрана все снова хорошо. Без какой-либо специальной конфигурации для экрана.

Я уже пытался сравнить много информации об окружающей среде между текстовой и экранной оболочками, но это не помогло. Например, локаль идентична, pythons sys.stdout.encoding одинакова, выполнение «:runtime syntax/colortest.vim» в vim выглядит правильно и красочно в обоих случаях.

1 ответ1

2

Это нормально. Это происходит просто потому, что консоль ядра Linux не поддерживает 256-цветный режим. Он не был написан для 256 цветов, так как в текстовом режиме VGA это просто невозможно. (В режиме кадрового буфера это возможно, но код все еще имеет те же ограничения.) GNU Screen это знает и автоматически переводит из 256-цветовой палитры в ближайшую 16-цветную.

Только самые последние версии Linux (3.13 и более поздние) начали распознавать управляющие коды из 256 цветов, но даже тогда они по-прежнему отображают их в 16-цветную палитру, как это делает Screen.

Существуют эмуляторы терминалов на основе фреймбуфера, такие как kmscon или fbterm, которые реализуют свой собственный рендеринг и рисуют все через KMS. Используйте их, если вы хотите способный терминал, избегающий X11.


Мигание текста происходит потому, что 256-цветные коды очень легко спутать с 16-цветными. Например, ESC [38;5;35m можно интерпретировать как 256-цветный код или три ANSI (16-цветных) кода.

  • Консоль Linux не знает, что означает 38 , поэтому она просто интерпретирует 5 как "enable blink" и 35 как «передний план - цвет # 5 (пурпурный)» обычным способом.
    (См., Например, эту таблицу в разделе "SGR".)

  • Между тем, ваши терминалы X11 распознают 38 как магический код «передний план - дополнительные цвета», поэтому они интерпретируют 5 как «использовать 256-цветовую палитру» и 35 как «используйте цвет # 35 (голубой)».
    (Существует также 24-битный режим RGB, например ESC [38;2;<r>;<g>;<b>m .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .