2017-03-13 67 views
0

我正試圖編寫一個函數,它將在Python控制檯中運行時生成一個簡單的小部件。這個小部件應該能夠識別終端大小。顯示小部件後,我將等待用戶的鍵盤輸入並根據類型調整內容。我現在所面臨的困難是如何在用戶調整終端的大小時使該小部件調整其顯示器。下面的代碼的簡化版本,我現在所擁有的:如何適應輸出到不斷變化的終端寬度

def test(): 
    import blessed 
    import signal 

    def draw(): 
     n = term.width - 3 
     print("+" + "=" * n + "+" + term.clear_eol) 
     print("|" + " " * (n//2 - 2) + 
       "TEST" + " " * (n - n//2 - 2) + "|" + term.clear_eol) 
     print("+" + "=" * n + "+" + term.clear_eol) 

    def redraw(_, __): 
     print(term.move_up * 3, end="") 
     draw() 

    term = blessed.Terminal() 
    draw() 
    signal.signal(signal.SIGWINCH, redraw) 
    with term.cbreak(): 
     term.inkey() 

這如果用戶展開的終端,或者如果他縮小了終端,但速度很慢(1個字符在一個時間)工作正常。但是,儘快縮短終端寬度將導致長行換行,從而破壞輸出。有沒有辦法解決這個問題?

+0

[如何獲得控制檯窗口寬度在python]可能的副本(http://stackoverflow.com/questions/566746/how-to-get-console-window-width-in-python) – nir0s

回答

0

該問題涉及諸如blessed 1.9.1之類的問題,它聲稱它是curses的簡化包裝。由於Python curses支持在SIGWINCH上進行重新繪製,所以斷言將繼承此包。實際上描述的功能是terminfo。詛咒比頁面顯示的要多得多。

要處理SIGWINCH使用祝福,您必須在腳本中捕捉並觸發重新繪製屏幕。 Height and Width中顯示的示例應該足以開始使用。

或者您可以使用curses,在您從getch讀取KEY_RESIZE之後進行重新繪製。

+0

謝謝托馬斯,但是這並不能幫助我解決問題。我首先嚐試了'curses',但問題是它將終端置於「全屏」模式(類似於'man'命令),而我希望我的輸出與終端中的所有其他輸出一起出現。 '祝福'包就是這樣做的。剩下的唯一問題是如何在終端收縮時妥善防止換行。 – Pasha

相關問題