2016-02-16 13 views
3

使用Python 3的ncurses綁定打印寬字符時,使用window.insnstr時會壓縮空格。下面的代碼重現該問題:在Python 3中,寬字符是curses的window.insnstr中斷了嗎?

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和ST,我得到下面的輸出:

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庫中的bug:addstr flavor比插入/刪除操作的使用頻率要高得多,而且ncurses必須做一些特殊的簿記來跟蹤雙寬字符。

這固定在patch 6.0.20160220,它最終會在你使用的任何包。

+0

感謝您解決這個問題。我發現在文本上設置某些屬性會阻止這個bug的發生,所以我最終做的是在所有的'addnstr'調用中添加'A_PROTECT',例如:'self.window.addnstr(0,0,line, self.width,curses.A_PROTECT)'。 'A_PROTECT'不是唯一可以工作的屬性,但是我選擇'A_PROTECT',因爲設置該屬性不會修改文本的可視外觀。 –

+0

也許這是通過在內部強制執行一些額外更新來實現的。我不確定,確切地說。 –