본문 바로가기
Programming/TclTk

TK 예제로 배우는 Tk

by Hunveloper 2022. 9. 8.
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

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

댓글