728x90
예제로 배우는 Tk
- Tk를 이용하여 쉽게 UI를 만들 수 있음
ExecLog
- UNIX 프로그램을 수행할 수 있는 간단한 사용자 인터페이스를 제공
- UI는 ‘Run it’과 ‘Quit’의 두 버튼, 명령을 입력 받는 entry widget, 수행된 로그를 기록하는 텍스트 widget으로 구성
- 프로그램을 파이프라인으로 수행하며 출력을 기다리기 위해 fileevent 명령을 사용
- 이 구조는 프로그램이 수행중인 경우라도 UI가 동작하도록 함
- ExecLog 프로그램의 실행 예와 소스 코드
# Set window title
wm title . ExecLog
# Create a frame for buttons and entry
frame .top -borderwidth 10
pack .top -side top -fill x
# Create the command buttons
button .top.quit -text Quit -command exit
set but [button .top.run -text "Run it" -command Run]
pack .top.quit .top.run -side right
# Create a labeled entry for the command
label .top.l -text Command: -padx 0
entry .top.cmd -width 20 -relief sunken \
-textvariable command
pack .top.l -side left
pack .top.cmd -side left -fill x -expand true
# Set up key binding equivalents to the buttons
bind .top.cmd <Return> Run
bind .top.cmd <Control-c> Stop
focus .top.cmd
# Create a text widget to log the output
frame .t
set log [text .t.log -width 80 -height 10\
-borderwidth 2 -relief raised -setgrid true \
-yscrollcommand {.t.scroll set}]
scrollbar .t.scroll -command {.t.log yview}
pack .t.scroll -side right -fill y
pack .t.log -side left -fill both -expand true
pack .t -side top -fill both -expand true
# Run the program and arrange to read its input
proc Run {} {
global command input log but
if [catch {open "|$command |& cat"} input] {
$log insert end $input\n
} else {
fileevent $input readable Log
$log insert end $command\n
$but config -text Stop -command Stop
}
}
# Read and log output from the program
proc Log {} {
global input log
if [eof $input] {
Stop
} else {
gets $input line
$log insert end $line\n
$log see end
}
}
# Stop the program and fix up the button
proc Stop {} {
global input but
catch {close $input}
$but config -text "Run it" -command Run
}
- wm title은 윈도우 타이틀 바의 이름을 변경
- wm 명령은 윈도우 관리자와 통신
- 윈도우 관리자는 위도우를 열고 닫으며 크기를 바꿀 수 있게 해주는 프로그램
- UI의 최상위 부분에 나타날 widget들을 담기 위해 프레임이 생성
- 프레임은 widget을 위한 공간을 마련하기 위해 vorder를 가지고 있음
frame .top -borderwidth 10
- 프레임은 메인 윈도우 안에 위치
- 기본적인 packing 면은 top이기에 -side top 옵션은 빼도 됨
- -fill x 옵션은 메인 윈도우의 크기만큼 프레임이 커지도록 함
- 하나의 버튼은 프로그램을 수행하는데 사용되고 다나는 프로그램을 종료할 때 사용
- 각 버튼의 이름은 .top.quit과 .top.run이다
- label과 entry도 .top프레임의 자식으로 생성
- entry의 크기는 입력 받을 수 있는 문자의 개수로 정함
- relieft 속성은 화면에 어떻게 보일 것인지를 정함
- label과 entry는 .top 프레임의 왼쪽에 배치
- entry widget에 대해 지정된 바인딩은 Enter 키나 Ctrl-C 키를 눌렀을 때도 동작을 취하게 함
- bind 명령은 Tcl 명령을 widget의 X event와 연결시킴
- 이벤트는 사용자가 Enter를 눌렀을 때 발생
- 이벤트는 사용자가 Ctrl-C를 눌렀을 때 발생
- 이벤트가 entry widget으로 가기 위해서 입력 포커스가 widget에 가 있어야 하기에 focus 명령으로 입력 포커스를 entry widget에 보내줌
- text widget이 생성되고 프레임에 스크롤바와 함께 들어감
- scrollbar는 Tk에서 별도의 widget이며 다른 widget과 연결됨
- test widget의 yscrolcommand 옵션은 widget이 수정될 때 scrollbar의 화면 표시를 갱신
- setgrid 속성을 켜면 메인 윈도우의 크기를 바꿈
- Run 와 Log , Stop 프로시져들은 프로그램을 수행하고 결과를 기록하며 수행을 중지함
Tcl Shell
- Tcl Shell 프로그램 예제
- bind 태그
frame .eval
set _t [text .eval.t -width 80 -height 20 \
-yscrollcommand {.eval.s set}]
scrollbar .eval.s -command {.eval.t yview}
pack .eval.s -side left -fill y
pack .eval.t -side right -fill both -expand true
pack .eval -fill both -expand true
.eval.t insert insert "Tcl eval log\n"
set prompt "tcl> "
.eval.t insert insert $prompt
.eval.t mark set limit insert
.eval.t mark gravity limit left
focus .eval.t
bind .eval.t <Return> { _Eval .eval.t; break }
bind .eval.t <Any-Key> {
if [%W compare insert < limit] {
%W mark set insert end
}
}
bindtags .eval.t {.eval.t Text all}
proc _Eval { t } {
global prompt _debug
set command [$t get limit end]
if [info complete $command] {
set err [catch {uplevel #0 $command} result]
$t insert insert \n$result\n
$t insert insert $prompt
$t see insert
$t mark set limit insert
return
}
}
- %W
- The path name of the window to which the event was reported (the window field from the event). Valid for all event types.
728x90
728x90
'Programming > TclTk' 카테고리의 다른 글
TK X 이벤트와 Tcl 명령의 연결 (0) | 2022.09.13 |
---|---|
TK Pack 형상 관리자 (0) | 2022.09.13 |
TK 기초 (0) | 2022.09.07 |
TCL 스크립트 라이브러리 (0) | 2022.09.06 |
TCL UNIX에서 작업하기 (0) | 2022.09.06 |
댓글