`console` — 진짜 콘솔이 없는 시스템에서 콘솔 제어하기
console — 진짜 콘솔이 없는 시스템에서 콘솔 제어하기
터미널 창이 따로 없는 환경에서 Tk 앱을 돌리면 표준 입출력을 보여줄 곳이 없어요. 그럴 때 Tk가 대신 마련해 주는 게 콘솔 창이에요. 일반적인 명령창처럼 입력을 받고 출력을 표시해 줘요.
본문
시그니처
console subcommand ?arg ...?
콘솔 창은 진짜 콘솔이 없는 플랫폼에서 표준 I/O 채널에 입력·출력을 가능하게 해 주는 대체물이에요. Tk 툴킷을 불러온 별도의 해석기(interpreter)로 구현되고, 이 해석기에 대한 제어는 console 명령으로 이뤄져요. 콘솔 창의 동작은 주로 Tk 라이브러리의 console.tcl 파일 내용으로 정의돼요.
TkAqua를 제외하면, 이 명령은 tclsh 해석기에 package require Tk로 Tk를 불러올 때는 쓸 수 없어요. 그 경우엔 일반적인 터미널이 존재한다고 보기 때문이에요. TkAqua에서는 시작 스크립트가 있고 stdin이 /dev/null일 때(예: Tk를 내장한 번들 앱을 macOS Launcher로 시작한 경우) 이 명령이 비활성화돼요. 그 경우 TK_CONSOLE 환경 변수를 정의하면 활성화할 수 있어요(Info.plist의 LSEnvironment 키로 설정).
하위 명령
console eval script — 콘솔 해석기에서 script를 Tcl 스크립트로 평가해요. 일반 해석기는 콘솔 해석기 안의 consoleinterp 명령으로 접근해요.
console hide — 콘솔 창을 보기에서 숨겨요. 콘솔 해석기에서 . 창을 withdraw하는 것과 정확히 같아요.
console show — 콘솔 창을 표시해요. 콘솔 해석기에서 . 창을 deiconify하는 것과 정확히 같아요.
console title ?string? — 콘솔 창의 제목을 조회하거나 바꿔요. string을 주지 않으면 현재 제목을 조회하고, 주면 그 값으로 설정해요. 콘솔 해석기에서 wm title 명령을 쓰는 것과 정확히 같아요.
메인 해석기 접근
콘솔 해석기의 consoleinterp 명령은 메인 해석기에서 스크립트를 평가하게 해 줘요. 두 하위 명령을 지원해요.
consoleinterp eval script — 메인 해석기의 전역 레벨에서 script를 Tcl 스크립트로 평가해요.
consoleinterp record script — 마치 콘솔에 직접 타이핑한 것처럼 메인 해석기의 전역 레벨에서 script를 기록하고 평가해요.
추가 트랩 호출
콘솔 해석기에는 메인 해석기의 활동에 반응해 호출되는 추가 명령이 몇 개 있어요. 이들은 콘솔의 내부 구현 일부라 경고 없이 바뀔 수 있으므로, 완전성을 위해 문서화된 것뿐이에요.
메인 해석기에서 stdout·stderr 채널로 나가는 콘솔 출력은 콘솔 해석기의 tk::ConsoleOutput 명령을 두 인자로 호출해서 처리돼요. 첫 인자는 쓰려는 채널 이름, 둘째 인자는 (인코딩과 줄바꿈 변환 처리 후) 채널에 쓸 문자열이에요. 메인 해석기의 . 창이 파괴되면(콘솔 해석기가 아직 삭제되지 않았다면) 콘솔 해석기의 tk::ConsoleExit 명령이 호출돼요.
기본 바인딩
기본 스크립트는 (text 위젯으로 구현된) 콘솔 창을 만들어 다음 동작을 갖게 해요.
- Tab 키를 누르면 TAB 문자(Tcl의
\t이스케이프에 정의된)를 삽입해요. - Return 키를 누르면 현재 줄이(
info complete규칙에 따라 완성됐다면) 메인 해석기로 보내져 평가돼요. - Delete 키는 선택된 텍스트(있으면)를 지우거나, (줄 끝이 아니라면) 커서 오른쪽 문자를 지워요.
- Backspace 키는 선택된 텍스트(있으면)를 지우거나, (줄 시작이 아니라면) 커서 왼쪽 문자를 지워요.
- Control+A 또는 Home 키는 커서를 줄 시작으로 옮겨요(줄에 프롬프트가 있으면 그 뒤로).
- Control+E 또는 End 키는 커서를 줄 끝으로 옮겨요.
- Control+P 또는 Up 키는 명령 히스토리의 이전 항목을 선택해요.
- Control+N 또는 Down 키는 명령 히스토리의 다음 항목을 선택해요.
- Control+B 또는 Left 키는 커서가 프롬프트에 있지 않으면 한 문자 뒤로 옮겨요.
- Control+F 또는 Right 키는 커서를 한 문자 앞으로 옮겨요.
- F9는 콘솔 창의 모든 자식을 파괴하고 콘솔 동작을 정의한 Tcl 스크립트를 다시 불러와 콘솔 창을 재구축해요.
그 밖의 동작은 대부분 일반 text 위젯과 같아요. 다만 <<Cut>> 이벤트가 <<Copy>>와 동일하게 처리된다는 점이 달라요.
예제
모든 플랫폼에 console 명령이 있는 건 아니어서, 디버깅 코드에는 개발 중 puts 출력이 보이도록 다음 코드 조각을 넣는 경우가 많아요.
catch {console show}
더 알아보기
destroy, fconfigure, history, interp, puts, text, wm 문서를 함께 보세요.