2012-09-12 3 views
1

나는 ncurses에 익숙하지 않지만, C에서 작동해야합니다. 무엇이 잘못되었는지는 모르겠지만, 어떤 문자를 연속적으로 인쇄하려고합니다. 그러나 어떻게 찾을 수 없습니까?파이썬 Ncurses는 하나의 문자를 위치에 인쇄합니다.

File "capture.py", line 37, in <module> 
    stdscr.move(y,x) 
    _curses.error: wmove() returned ERR 

코드 :

(irrelevant parts of the code are removed) 
import curses 

stdscr = curses.initscr() 
curses.noecho(); 

palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8'] 

# index is something between 0 and len(palette), not important 
for x in xrange(50): 
    for y in xrange(30): 
     stdscr.move(y,x) 
     sdtscr.addch(palette[index]) 
stdscr.refresh() 
+0

어떤 오류가 보이고, 무엇을 기대하며 무엇이'index'입니까? –

+0

@hayden 오류 메시지가 표시되지 않고 이상한 이유로 업데이트되었습니다. 인덱스는 0에서 9까지 동적입니다. – Mustafa

+0

내 생각에 24- (또는 25- 라인) 터미널에있어 stdscr.move (24, 0)에 도달하면 실패합니다 . try/catch를 넣고 화면을 재설정 한 다음 다시 올리기 전에 x 및 y를 기록하여 진행 상황을 볼 수 있습니다. – abarnert

답변

5

저주 (예를 들어, http://linux.die.net/man/3/move)를 이동 당신이 문서를 읽을 경우

012이 오류를 수정

첫 번째 코드는 파이썬에서 나오지 않으므로 두 번째 코드가 문제 일 수 있습니다. 그리고 빠른 테스트는 코드를 실행하는 것이 30 줄 또는 더 높은 터미널에서 제대로 작동하지만 일반적인 24 또는 25 행 터미널에서는 실패한다는 것을 보여줍니다.

당신이 디버그하기 쉽도록 첫 번째 (아마도 불가능 출력을 볼 수있게 엉망 그렇게 터미널이 남아 있지)을 try/finally:curses.endscr()에서 전체를 포장하려면

. 그런 다음 x 및 y를 기록하는/ except:stdscr.move으로 전화를 걸면 실패한 위치를 알 수 있습니다. 또한 빠른 테스트를 위해 "30"을 명령 줄 인수로 사용합니다.

이제
#!/usr/bin/python 

import sys 
import curses 

height = int(sys.argv[1]) if len(sys.argv) > 1 else 24 

try: 
    stdscr = curses.initscr() 
    curses.noecho(); 

    palette = [' ', ' ', '.', '.', '/', 'c', '(', '@', '#', '8'] 

    index = 0 
    for x in xrange(50): 
     for y in xrange(height): 
      index = (index + 1) % len(palette) 
      try: 
       stdscr.move(y,x) 
      except Exception as e: 
       stdscr.refresh() 
       curses.endwin() 
       print 
       print x, y, e 
       sys.exit(1) 
      stdscr.addch(palette[index]) 
    stdscr.refresh() 
finally: 
    curses.endwin() 

python cursetest 30 인쇄 : 여기에 모든 변경 버전의 내가 의심으로

0 25 wmove() returned ERR 

그래서,이 X = 0에 실패하자, Y (25) =. 내가 80x50 내 터미널을 늘릴 경우

, 그것은 작동하지만 지금 python cursetest 60 실패 : 그 문제에 대한

0 50 wmove() returned ERR 

, 내가 40x50 내 터미널을 축소 할 경우, python cursetest 30는보다는 수평 가장자리에 실패 수직 :

40 0 wmove() returned ERR 

당신이 오히려 창에 getmaxyx()를 호출하려고 발생했을 때 오류를 잡으려고 노력보다는 사전에이를 확인하려면; y < 30이면 좋은 오류 메시지를 표시하고 종료 할 수 있습니다 (또는 다른 작업을 수행하거나 다른 작업을 수행 할 수 있음).

마지막으로, 빠른 확인은 C에서 작동하지 않음을 보여줍니다. 물론 던져진 예외는 없습니다. 원할 경우 반환되는 오류를 무시할 수 있지만, 결국 (24, 49) 위치에 300 번 연속 쓰기가됩니다. (당신이 정말로 원한다면 파이썬에서 똑같은 일을 할 수 있습니다 ...)

관련 문제