2016-02-16 1 views
3

При печати широких символов с использованием привязок ncurses Python 3 пробелы сжимаются при использовании window.insnstr. Вот код, чтобы воспроизвести проблему:Является ли curses 'window.insnstr сломанным в Python 3 для широких символов?

import curses 


def main(window): 
    window.insnstr(0, 0, "insnstr", 80) 
    window.insnstr(1, 0, "赵启明   XXX", 80) 
    window.insnstr(2, 0, "001122   XXX", 80) 
    window.insnstr(3, 0, "赵启明   XXX", 80) 
    window.insnstr(4, 0, "001122   XXX", 80) 
    window.addnstr(6, 0, "addnstr", 80) 
    window.addnstr(7, 0, "赵启明   XXX", 80) 
    window.addnstr(8, 0, "001122   XXX", 80) 
    window.addnstr(9, 0, "赵启明   XXX", 80) 
    window.addnstr(10, 0, "001122   XXX", 80) 
    window.addnstr(11, 0, "Press any key to exit.", 80) 
    window.refresh() 
    window.get_wch() 


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

С tmux, Xterm и й, я получаю следующий результат:

insnstr 
赵启明  XXX 
001122   XXX 
赵启明  XXX 
001122   XXX 

addnstr 
赵启明   XXX 
001122   XXX 
赵启明   XXX 
001122   XXX 
Press any key to exit. 

Я ожидаю, что выравнивание будет одинаковым в обоих блоках. Интересно, если я заменю пространство с любым другим символом, выравнивание соответствует:

insnstr 
赵启明----------XXX 
001122----------XXX 
赵启明----------XXX 
001122----------XXX 

addnstr 
赵启明----------XXX 
001122----------XXX 
赵启明----------XXX 
001122----------XXX 
Press any key to exit. 

В зависимости от вашего шрифта браузера, номера могут или не могут быть приведены в соответствии; обратитесь к скриншоту, чтобы увидеть, как выглядит результат в эмуляторе терминала:

screenshot of terminal

Является ли это ошибка в библиотеке Ncurses, в реализации языка Python библиотеки, или я недоразумение, как это проклинает функция должна работать ?

ответ

0

Это похоже на ошибку в библиотеке ncurses: addstr flavors используются гораздо чаще, чем операции вставки/удаления, а ncurses приходится выполнять специальную учетную запись, чтобы отслеживать символы двойной ширины.

Это исправлено в patch 6.0.20160220, которое в конечном итоге будет в любом пакете, который вы используете.

+0

Спасибо за фиксацию этого. Я обнаружил, что установка определенных атрибутов в тексте будет препятствовать этой ошибке, поэтому то, что я закончил, добавляет 'A_PROTECT' ко всем моим вызовам' addnstr', например: 'self.window.addnstr (0, 0, строка, self.width, curses.A_PROTECT) '. 'A_PROTECT' - не единственное свойство, которое будет работать, но я выбрал' A_PROTECT', поскольку установка этого свойства не изменяет визуальный внешний вид текста. –

+0

Возможно, это заставило его работать, заставляя некоторые дополнительные обновления внутренне. Я точно не уверен. –

Смежные вопросы