Python으로 curses 프로그래밍
Python으로 curses 프로그래밍 (Curses Programming with Python)
이 문서는 curses 확장 모듈로 텍스트 모드 화면을 제어하는 방법을 설명해요. 저자는 A.M. Kuchling, Eric S. Raymond이고, Release 2.04 문서를 기준으로 합니다.
출처: Python 공식 문서
curses가 뭐예요?
curses 라이브러리는 텍스트 기반 터미널을 위한, 터미널 종류에 무관한(terminal-independent) 화면 그리기와 키보드 처리 기능을 제공해요. 그런 터미널에는 VT100, Linux 콘솔, 각종 프로그램이 제공하는 시뮬레이션 터미널이 포함됩니다. 디스플레이 터미널은 커서 이동, 화면 스크롤, 영역 지우기 같은 흔한 작업을 수행하는 여러 제어 코드를 지원해요. 그런데 터미널마다 쓰는 코드가 제각각이고, 저마다 사소한 버릇(quirks)도 있어요.
그래픽 디스플레이가 흔한 시대에 "왜 이런 걸 굳이?"라고 물을 수 있겠죠. 캐릭터 셀 디스플레이 터미널이 구식 기술인 건 사실이지만, 그걸로 멋진 일을 하는 게 여전히 가치 있는 틈새가 있어요. 하나는 X 서버가 돌지 않는 작은 발자국(footprint)이거나 임베디드 Unix 환경이고, 또 하나는 그래픽 지원이 가능해지기 전에 실행돼야 할 OS 설치 프로그램이나 커널 설정 도구 같은 것들이죠.
curses 라이브러리는 꽤 기본적인 기능을 제공하면서, 프로그래머에게 서로 겹치지 않는 여러 텍스트 창을 가진 디스플레이라는 추상화를 줍니다. 창의 내용은 여러 방식(텍스트 추가, 지우기, 모양 바꾸기)으로 변경할 수 있고, curses 라이브러리가 올바른 출력을 만들기 위해 터미널에 보내야 할 제어 코드를 알아서 계산해요. curses는 버튼, 체크박스, 다이얼로그 같은 UI 개념을 많이 제공하지는 않아요. 그런 기능이 필요하다면 Urwid 같은 UI 라이브러리를 고려해 보세요.
curses 라이브러리는 원래 BSD Unix용으로 작성됐고, 이후 AT&T의 System V 계열 Unix에서 많은 개선과 새 함수가 추가됐어요. BSD curses는 더 이상 관리되지 않는데, AT&T 인터페이스를 오픈소스로 구현한 ncurses로 대체됐습니다. Linux나 FreeBSD 같은 오픈소스 Unix를 쓰고 있다면 거의 확실히 ncurses를 쓰는 거예요. 대부분의 상용 Unix 버전이 System V 코드에 기반하므로, 여기 설명하는 함수들은 대부분 쓸 수 있을 거예요. 다만 일부 독점 Unix가 들고 있는 옛 버전의 curses는 전부 지원하지 않을 수 있어요.
Windows용 Python에는 curses 모듈이 포함돼 있지 않습니다. 서드파티 windows-curses 패키지가 Windows에서 같은 인터페이스를 제공해요.
Python curses 모듈
Python 모듈은 curses가 제공하는 C 함수를 꽤 단순하게 감싼(wrapper) 형태예요. 이미 C에서 curses 프로그래밍에 익숙하다면 그 지식을 Python으로 옮기는 게 정말 쉬울 거예요. 가장 큰 차이는, Python 인터페이스가 addstr(), mvaddstr(), mvwaddstr() 같은 서로 다른 C 함수들을 하나의 addstr() 메서드로 합쳐 더 단순하게 만든다는 점이에요. 이건 나중에 더 자세히 다룰게요.
이 HOWTO는 curses와 Python으로 텍스트 모드 프로그램을 작성하는 법을 소개합니다. curses API의 완전한 가이드를 목표로 하지는 않아요. 그게 필요하다면 Python 라이브러리 가이드의 ncurses 절과 ncurses C 매뉴얼 페이지를 보세요. 다만 기본적인 아이디어는 잡을 수 있을 거예요.
curses 애플리케이션 시작과 종료
무엇보다 먼저 curses를 초기화해야 해요. initscr() 함수를 호출하면 터미널 타입을 판별하고, 필요한 설정 코드를 터미널에 보내고, 여러 내부 데이터 구조를 만듭니다. 성공하면 initscr()은 전체 화면을 나타내는 창 객체를 돌려줘요. 보통 C 변수의 이름을 따서 stdscr이라고 부릅니다.
import curses
stdscr = curses.initscr()
보통 curses 애플리케이션은 키를 누를 때마다 화면에 자동으로 찍히는 에코(echo)를 꺼서, 키를 읽되 특정 상황에서만 화면에 표시하게 해요. 이건 noecho() 함수를 호출하면 됩니다.
curses.noecho()
또 애플리케이션이 Enter 키를 누르지 않아도 키에 즉시 반응해야 하는 경우가 흔해요. 이를 cbreak 모드라고 하며, 통상적인 버퍼 입력 모드와 반대되는 개념이에요.
curses.cbreak()
터미널은 보통 커서 키나 Page Up·Home 같은 탐색 키를 멀티바이트 이스케이프 시퀀스로 돌려줍니다. 애플리케이션을 그 시퀀스를 기대하고 처리하도록 직접 작성할 수도 있지만, curses가 대신 처리해 curses.KEY_LEFT 같은 특별한 값을 돌려주게 할 수 있어요. curses가 그 일을 하게 하려면 keypad 모드를 켜야 합니다.
stdscr.keypad(True)
curses 애플리케이션을 종료하는 건 시작보다 훨씬 쉽습니다.
curses.nocbreak()
stdscr.keypad(False)
curses.echo()
이렇게 하면 curses 친화적인 터미널 설정을 되돌려요. 그러고 나서 endwin() 함수를 호출해 터미널을 원래의 실행 모드로 복원합니다.
curses.endwin()
curses 애플리케이션을 디버깅할 때 흔한 문제 하나는, 애플리케이션이 터미널을 이전 상태로 복원하지 않고 죽어서 터미널이 엉망이 되는 거예요. Python에서 이건 코드에 버그가 있어 잡히지 않은 예외(uncaught exception)가 발생할 때 흔히 일어납니다. 예를 들어 키를 입력해도 화면에 에코되지 않아서 셸을 쓰기 어려워지죠.
Python에서는 이런 복잡함을 피하고 디버깅을 훨씬 쉽게 만들 수 있어요. curses.wrapper() 함수를 가져와 다음과 같이 쓰면 됩니다:
from curses import wrapper
def main(stdscr):
# Clear screen
stdscr.clear()
# This raises ZeroDivisionError when i == 10.
for i in range(0, 11):
v = i-10
stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))
stdscr.refresh()
stdscr.getkey()
wrapper(main)
wrapper() 함수는 호출 가능한 객체를 받아 위에서 설명한 초기화를 수행하고, 색 지원이 있으면 색도 초기화해요. 그러고 나서 여러분이 준 callable을 실행합니다. callable이 반환되면 wrapper()가 터미널의 원래 상태를 복원해요. 이 callable은 예외를 잡아 터미널 상태를 복원한 뒤 예외를 다시 일으키는(re-raise)try ... except 안에서 호출됩니다. 그래서 예외가 발생해도 터미널이 이상한 상태로 남지 않고, 예외 메시지와 traceback을 읽을 수 있어요.
윈도우와 패드 (Windows and Pads)
**윈도우(window)**는 curses의 기본 추상화예요. 창 객체는 화면의 사각 영역을 나타내고, 텍스트 표시·지우기·사용자 문자열 입력 같은 메서드를 지원합니다.
initscr() 함수가 돌려주는 stdscr 객체는 화면 전체를 덮는 창 객체예요. 많은 프로그램은 이 단일 창만으로 충분하지만, 화면을 더 작은 창들로 나눠 각각 따로 다시 그리거나 지우고 싶을 수도 있겠죠. newwin() 함수는 주어진 크기의 새 창을 만들어 그 창 객체를 돌려줍니다.
begin_x = 20; begin_y = 7
height = 5; width = 40
win = curses.newwin(height, width, begin_y, begin_x)
curses가 쓰는 좌표계는 좀 특이하다는 점에 주의하세요. 좌표는 항상 y,x 순서로 넘기고, 창의 왼쪽 위 모서리가 좌표 (0,0)이에요. 이건 x 좌표가 먼저 오는 일반적인 좌표 처리 관례를 깨는 것이죠. 대부분의 다른 컴퓨터 애플리케이션과 달라서 아쉽지만, curses가 처음 쓰인 때부터 그래 왔고 지금 와서 바꾸기엔 너무 늦었어요.
여러분 애플리케이션은 curses.LINES와 curses.COLS 변수로 화면 크기(y와 x 크기)를 알 수 있어요. 그러면 유효한 좌표는 (0,0)부터 (curses.LINES - 1, curses.COLS - 1)까지가 됩니다.
텍스트를 표시하거나 지우는 메서드를 호출해도 그 효과가 화면에 즉시 나타나지 않아요. 대신 창 객체의 refresh() 메서드를 호출해야 화면이 갱신됩니다.
이유는 curses가 원래 느린 300-baud 터미널 연결을 염두에 두고 작성됐기 때문이에요. 그런 터미널에서는 화면을 다시 그리는 데 걸리는 시간을 최소화하는 게 매우 중요했죠. 그래서 curses는 화면의 변화를 모아두었다가 refresh()를 호출할 때 가장 효율적인 방식으로 표시합니다. 예를 들어 프로그램이 어떤 창에 텍스트를 표시한 뒤 그 창을 지운다면, 원래 텍스트는 결코 보이지 않으므로 보낼 필요가 없어요.
실제로 curses에게 창을 다시 그리라고 명시하는 게 프로그래밍을 크게 복잡하게 만들지는 않아요. 대부분의 프로그램은 활발하게 작업하다가 사용자의 키 입력이나 다른 동작을 기다리며 멈추죠. 사용자 입력을 기다리며 멈추기 전에 화면이 다시 그려졌는지만 확인하면 돼요. stdscr.refresh()나 다른 관련 창의 refresh() 메서드를 먼저 호출하면 됩니다.
**패드(pad)**는 창의 특수한 경우예요. 실제 디스플레이 화면보다 더 클 수 있고, 패드의 일부분만 한 번에 표시됩니다. 패드를 만들려면 패드의 높이와 너비가 필요하고, 패드를 갱신하려면 패드의 하위 구역이 표시될 화면상 영역의 좌표를 지정해야 해요.
pad = curses.newpad(100, 100)
# These loops fill the pad with letters; addch() is
# explained in the next section
for y in range(0, 99):
for x in range(0, 99):
pad.addch(y,x, ord('a') + (x*x+y*y) % 26)
# Displays a section of the pad in the middle of the screen.
# (0,0) : coordinate of upper-left corner of pad area to display.
# (5,5) : coordinate of upper-left corner of window area to be filled
# with pad content.
# (20, 75) : coordinate of lower-right corner of window area to be
# : filled with pad content.
pad.refresh( 0,0, 5,5, 20,75)
이 refresh() 호출은 화면에서 (5,5)부터 (20,75)까지의 사각 영역에 패드의 한 구역을 표시해요. 표시되는 구역의 왼쪽 위 모서리는 패드의 (0,0) 좌표입니다. 그 차이를 빼면 패드는 일반 창과 똑같고 같은 메서드를 지원해요.
화면에 여러 창과 패드가 있다면, 화면 각 부분이 갱신될 때 생기는 성가신 깜빡임을 막고 화면을 더 효율적으로 갱신하는 방법이 있어요. 사실 refresh()는 두 가지를 수행합니다:
- 각 창의
noutrefresh()메서드를 호출해, 화면의 원하는 상태를 나타내는 내부 데이터 구조를 갱신한다 doupdate()함수를 호출해, 데이터 구조에 기록된 원하는 상태와 일치하도록 물리적 화면을 바꾼다
대신 여러 창에 noutrefresh()를 호출해 데이터 구조를 갱신하고 나서, doupdate()를 한 번 호출해 화면을 갱신해도 돼요.
텍스트 표시 (Displaying Text)
C 프로그래머 입장에서 curses는 때로 서로 미묘하게 다른 함수들의 미로처럼 보일 수 있어요. 예를 들어 addstr()은 stdscr 창의 현재 커서 위치에 문자열을 표시하고, mvaddstr()은 문자열을 표시하기 전에 먼저 주어진 y,x 좌표로 이동해요. waddstr()은 addstr()과 같지만 기본값인 stdscr 대신 사용할 창을 지정할 수 있게 해 주고, mvwaddstr()은 창과 좌표를 둘 다 지정할 수 있게 해 줍니다.
다행히 Python 인터페이스는 이런 세부 사항을 다 숨겨 줘요. stdscr도 다른 창처럼 평범한 창 객체이고, addstr() 같은 메서드는 여러 인자 형태를 받아들입니다. 보통 네 가지 형태가 있어요.
| 형태 (Form) | 설명 (Description) |
|---|---|
str 또는 ch |
현재 위치에 문자열 str 또는 문자 ch를 표시 |
str 또는 ch, attr |
현재 위치에 속성 attr을 사용해 문자열 str 또는 문자 ch를 표시 |
y, x, str 또는 ch |
창 안의 위치 y,x로 이동해 str 또는 ch를 표시 |
y, x, str 또는 ch, attr |
창 안의 위치 y,x로 이동해 속성 attr을 사용해 str 또는 ch를 표시 |
**속성(attribute)**은 텍스트를 볼드체, 밑줄, 역상(reverse video), 색 같은 강조 형태로 표시할 수 있게 해 줘요. 자세한 내용은 다음 하위 절에서 설명할게요.
addstr() 메서드는 표시할 값으로 Python 문자열이나 바이트 문자열(bytestring)을 받아요. 바이트 문자열의 내용은 있는 그대로 터미널로 보내집니다. 와이드 문자(wide-character) 지원이 없는 빌드에서는 문자열이 창의 encoding 속성 값으로 인코딩되는데, 기본값은 locale.getencoding()이 돌려주는 기본 시스템 인코딩이에요.
addch() 메서드는 문자 하나를 받는데, 길이 1의 문자열, 길이 1의 바이트 문자열, 정수 중 하나일 수 있어요. 터미널의 대체 문자 집합(alternate character set)에 있는 문자들을 위한 상수도 제공됩니다. 예를 들어 ACS_PLMINUS는 +/- 기호이고, ACS_ULCORNER는 상자의 왼쪽 위 모서리(테두리를 그릴 때 편리)예요. 적절한 유니코드 문자를 쓰는 것도 가능합니다.
윈도우는 마지막 연산 후 커서가 어디에 있었는지 기억하므로, y,x 좌표를 생략하면 문자열이나 문자가 마지막 연산이 끝난 위치에 표시돼요. move(y,x) 메서드로 커서를 이동할 수도 있어요. 어떤 터미널은 항상 깜빡이는 커서를 표시하므로, 커서를 방해가 되지 않는 위치에 놓는 게 좋아요. 커서가 무작위해 보이는 위치에서 깜빡이면 혼란스러울 수 있으니까요.
애플리케이션에 깜빡이는 커서가 아예 필요 없다면 curs_set(False)를 호출해 안 보이게 만들 수 있어요. 창 메서드 leaveok()은 다른 일을 합니다. 인자가 참이면, curses는 커서를 창의 커서 위치로 되돌리는 대신 마지막 갱신이 놓은 자리에 그대로 둡니다.
속성과 색 (Attributes and Color)
문자는 다양한 방식으로 표시될 수 있어요. 텍스트 기반 애플리케이션의 상태 표시줄은 보통 역상(reverse video)으로 보여주고, 텍스트 뷰어는 특정 단어를 강조해야 할 수도 있죠. curses는 화면의 각 셀에 속성을 지정하게 해서 이를 지원합니다.
속성은 정수 하나이고, 각 비트가 서로 다른 속성을 나타내요. 여러 속성 비트가 설정된 상태로 텍스트를 표시해 볼 수 있지만, curses는 가능한 모든 조합이 지원되거나 모두 시각적으로 구분된다는 걸 보장하지는 않습니다. 그건 사용 중인 터미널의 능력에 달렸으니, 여기 나열하는 가장 흔히 쓰이는 속성을 고수하는 게 가장 안전해요.
| 속성 (Attribute) | 설명 (Description) |
|---|---|
A_BLINK |
깜빡이는 텍스트 |
A_BOLD |
매우 밝거나 굵은 텍스트 |
A_DIM |
절반 밝기의 텍스트 |
A_REVERSE |
역상(reverse-video) 텍스트 |
A_STANDOUT |
사용 가능한 최고의 강조 모드 |
A_UNDERLINE |
밑줄 있는 텍스트 |
예를 들어 화면 맨 윗줄에 역상 상태표시줄을 표시하려면 이렇게 코딩하면 돼요:
stdscr.addstr(0, 0, "Current mode: Typing mode",
curses.A_REVERSE)
stdscr.refresh()
curses 라이브러리는 색을 제공하는 터미널에서는 색도 지원해요. 가장 흔한 그런 터미널은 아마 Linux 콘솔이고, 그다음이 컬러 xterm이에요.
색을 쓰려면 initscr() 직후에 start_color() 함수를 호출해 기본 색 집합을 초기화해야 합니다(curses.wrapper() 함수는 이걸 자동으로 해줘요). 그러고 나면, 사용 중인 터미널이 실제로 색을 표시할 수 있다면 has_colors() 함수가 TRUE를 돌려줍니다. (참고: curses는 캐나다/영국식 철자 'colour' 대신 미국식 철자 'color'를 써요. 영국식 철자에 익숙하다면 이 함수들 때문에 철자를 틀리는 걸 각오해야 합니다.)
curses 라이브러리는 유한한 개수의 **색상 쌍(color pair)**을 유지하는데, 각 쌍은 전경(또는 텍스트) 색과 배경 색을 포함해요. 색상 쌍에 해당하는 속성 값은 color_pair() 함수로 얻을 수 있고, 이건 A_REVERSE 같은 다른 속성과 비트 OR 할 수 있어요. 다만 역시 그런 조합이 모든 터미널에서 동작한다는 보장은 없습니다.
색상 쌍 1을 사용해 텍스트 한 줄을 표시하는 예시예요:
stdscr.addstr("Pretty text", curses.color_pair(1))
stdscr.refresh()
앞서 말했듯 색상 쌍은 전경색과 배경색으로 구성됩니다. init_pair(n, f, b) 함수는 색상 쌍 n의 정의를 전경색 f, 배경색 b로 바꿔요. 색상 쌍 0은 흰색 글자/검은 배경으로 하드와이어되어 있어 바꿀 수 없습니다.
색은 번호가 매겨지고, start_color()는 색 모드를 활성화할 때 8가지 기본 색을 초기화해요. 그 색은 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, 7:white예요. curses 모듈은 각 색에 대해 이름 붙은 상수 curses.COLOR_BLACK, curses.COLOR_RED 등을 정의합니다.
이걸 다 합쳐 볼게요. 색 1을 흰 배경에 빨간 글자로 바꾸려면 이렇게 호출하면 됩니다:
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
색상 쌍을 바꾸면 그 쌍으로 이미 표시된 텍스트도 전부 새 색으로 바뀌어요. 새 텍스트를 이 색으로 표시하려면:
stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))
매우 화려한 터미널은 실제 색의 정의를 주어진 RGB 값으로 바꿀 수 있어요. 이러면 보통 빨간색인 색 1을 보라색이나 파란색, 원하는 아무 색으로 바꿀 수 있죠. 아쉽게도 Linux 콘솔은 이걸 지원하지 않아서 제가 시험해 보고 예시를 들 수 없어요. can_change_color()를 호출하면 터미널이 이 능력을 갖췄는지 확인할 수 있고, True가 돌아오면 그 능력이 있는 거예요. 그렇게 유능한 터미널을 갖고 있다면 시스템의 man 페이지를 참고하세요.
사용자 입력 (User Input)
C curses 라이브러리는 아주 단순한 입력 메커니즘만 제공해요. Python의 curses 모듈은 기본적인 텍스트 입력 위젯을 추가합니다. (Urwid 같은 다른 라이브러리는 더 광범위한 위젯 컬렉션을 갖고 있어요.)
창에서 입력을 받는 메서드는 세 가지가 있어요:
get_wch()는 화면을 갱신한 뒤 사용자가 키를 누를 때까지 기다리고, 앞서echo()가 호출됐다면 그 키를 표시해요. 선택적으로 멈추기 전에 커서를 이동할 좌표를 지정할 수 있습니다.getch()도 같은 일을 하지만 문자 대신 키의 코드를 돌려줘요. ncurses에서 이건 현재 로캘에서 키를 인코딩한 한 바이트라서, 여러 바이트로 인코딩된 문자는 한 번에 한 바이트씩 여러 번 호출해야 해요.getkey()는getch()와 같지만 문자열을 돌려줍니다. 일반 키는 길이 1의 문자열로, 특수 키는KEY_UP같은 이름으로 돌려주죠.
사용자를 기다리지 않게 하려면 nodelay() 창 메서드를 쓰면 됩니다. nodelay(True) 이후 그 창에 대한 read는 논블로킹이 돼요. 입력이 준비되지 않았음을 알리기 위해 get_wch()와 getkey()는 예외를 일으키고, getch()는 -1을 돌려줍니다. 또 halfdelay() 함수를 쓸 수도 있는데, 사실상 각 read에 타이머를 설정하는 거예요. 지정된 지연(10분의 1초 단위) 안에 입력이 없으면 read가 같은 방식으로 실패합니다.
Page Up, Home, 커서 키 같은 특수 키는 세 메서드 모두에서 KEY_* 상수 중 하나로 돌아오며, 전부 255보다 큽니다. 반환된 값을 curses.KEY_PPAGE, curses.KEY_HOME, curses.KEY_LEFT 같은 상수와 비교할 수 있어요. 프로그램의 메인 루프는 대략 이렇게 생겼을 거예요:
while True:
c = stdscr.get_wch()
if c == 'p':
PrintDocument()
elif c == 'q':
break # Exit the while loop
elif c == curses.KEY_HOME:
x = y = 0
curses.ascii 모듈은 정수 또는 길이 1의 문자열 인자를 받는 ASCII 클래스 소속 함수를 제공해요. 이런 루프를 위한 더 읽기 쉬운 테스트를 작성하는 데 유용할 수 있습니다. 또 정수 또는 길이 1의 문자열 인자를 받아 같은 타입을 돌려주는 변환 함수도 제공해요. 예를 들어 curses.ascii.ctrl()은 인자에 해당하는 제어 문자를 돌려줍니다.
한 줄 전체를 가져오는 메서드 getstr()도 있어요. 하지만 그 기능이 꽤 제한적이라 자주 쓰이진 않습니다. 사용 가능한 편집 키는 지우기(erase)·죽이기(kill) 문자와 줄을 끝내는 Enter 키뿐이에요. getstr()은 bytes 객체를 돌려주고, 선택적으로 고정된 바이트 수로 제한할 수 있습니다.
curses.echo() # Enable echoing of characters
# Get a line of at most 15 bytes, with the cursor on the top line
s = stdscr.getstr(0,0, 15)
curses.textpad 모듈은 Emacs스러운 키 바인딩 집합을 지원하는 텍스트 박스를 제공해요. Textbox 클래스의 여러 메서드는 입력 검증을 곁들인 편집과, 결과를 뒤따르는 공백 포함/미포함으로 수집하는 것을 지원합니다. 예시를 볼게요:
import curses
from curses.textpad import Textbox, rectangle
def main(stdscr):
stdscr.addstr(0, 0, "Enter IM message: (hit Ctrl-G to send)")
editwin = curses.newwin(5,30, 2,1)
rectangle(stdscr, 1,0, 1+5+1, 1+30+1)
stdscr.refresh()
box = Textbox(editwin)
# Let the user edit until Ctrl-G is struck.
box.edit()
# Get resulting contents
message = box.gather()
자세한 내용은 curses.textpad 라이브러리 문서를 보세요.
더 많은 정보 (For More Information)
이 HOWTO는 화면 내용 읽기나 xterm 인스턴스의 마우스 이벤트 캡처 같은 고급 주제는 다루지 않지만, curses 모듈의 Python 라이브러리 페이지는 이제 꽤 완전해졌어요. 그다음은 그걸 살펴보는 걸 추천할게요.
curses 함수의 세부 동작이 궁금하다면, ncurses든 독점 Unix 벤더의 것이든 여러분의 curses 구현의 매뉴얼 페이지를 참고하세요. 매뉴얼 페이지는 각종 버릇을 문서화하고, 사용 가능한 모든 함수·속성·ACS_* 문자의 완전한 목록도 제공합니다.
curses API가 너무 방대해서 Python 인터페이스에서 지원되지 않는 함수도 있어요. 그것은 구현이 어려워서라기보다 아직 아무도 필요로 하지 않아서인 경우가 많습니다. 또 Python은 아직 ncurses와 연관된 메뉴 라이브러리를 지원하지 않아요. 이런 지원을 추가하는 패치(수정본)는 환영합니다. Python에 패치를 제출하는 방법은 Python Developer's Guide에서 알아볼 수 있어요.
- Writing Programs with NCURSES — C 프로그래머를 위한 긴 튜토리얼
- The ncurses man page — ncurses 매뉴얼 페이지
- The ncurses FAQ — ncurses FAQ
- "Use curses… don't swear" — curses나 Urwid로 터미널을 제어하는 PyCon 2013 발표 영상
- "Console Applications with Urwid" — Urwid로 작성한 애플리케이션을 시연하는 PyCon CA 2012 발표 영상
더 알아보기 (Learn more)
curses라이브러리 문서 — 모듈 레퍼런스 (기능 전체)curses.textpad라이브러리 문서 — 텍스트 박스 위젯- windows-curses 패키지 — Windows용 같은 인터페이스
- Urwid — 더 풍부한 위젯을 가진 UI 라이브러리
- Python 공식 문서: Curses Programming with Python