2017-03-13 8 views
0

파이썬의 콘솔에서 실행할 때 간단한 위젯을 생성하는 함수를 작성하려고합니다. 이 위젯은 터미널 크기를 인식해야합니다. 위젯을 표시 한 후 사용자의 키보드 입력을 기다리고 유형에 따라 내용을 조정합니다. 지금 당장 가지고있는 어려움은 사용자가 터미널의 크기를 조정할 때 해당 위젯이 디스플레이 을 조정하는 방법입니다. 사용자가 터미널을 확장, 또는 그 (한 번에 1 개 문자) 터미널하지만 매우 느리게을 축소하는 경우 경우변경 터미널의 너비에 출력을 적응하는 방법

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() 

이 잘 작동 : 여기에 내가 지금 가지고있는 코드의 단순화 된 버전입니다. 그러나 단자 너비를 빨리 줄이면 긴 선이 감겨져 출력이 손상 될 수 있습니다. 이 문제를 해결할 수있는 방법이 있습니까?

+0

[파이썬에서 콘솔 창 너비를 얻는 방법] (http://stackoverflow.com/questions/566746/how-to-get-console-window-width-in-python) – nir0s

답변

0

질문은 blessed 1.9.1과 같은 것으로, 이는 curses의 단순한 래퍼임을 나타냅니다. 파이썬 curses는 SIGWINCH에서 다시 그리기를 지원하므로이 어설 션은이 패키지로 이어질 것입니다. 사실 설명 된 기능은 terminfo입니다. 저주는 그 페이지가 보여주는 것보다 훨씬 많은 일을합니다.

축복을 사용하여 SIGWINCH을 처리하려면 스크립트에서 해당 문자를 잡아서 화면을 다시 칠해야합니다. Height and Width에 표시된 예는 시작하기에 충분해야합니다.

또는 KEY_RESIZEgetch에서 읽은 후 다시 칠할 곳을 저주 할 수 있습니다.

+0

감사합니다. Thomas 그 문제를 해결하는 데 도움이되지 않습니다. 처음에'curses'를 시도했으나 문제는 터미널을 "전체 화면"모드 ('man' 명령과 유사)로 설정하는 반면, 출력은 터미널의 다른 모든 출력과 함께 나타나게하는 것입니다. '축복받은'패키지는 바로 그 역할을합니다. 그리고 남아있는 유일한 문제는 단말기가 줄어들 때 라인 랩을 적절히 방지하는 방법입니다. – Pasha