본문 바로가기
Programming/TclTk

TK 기초

by Hunveloper 2022. 9. 7.
728x90

TK

  • Tk는 윈도우 프로그래밍을 위한 툴킷이지만 매킨토시에도 사용 가능
  • Tk는 widget을 생성하고 관리할 수 있는 TCL 명령들을 제공
  • widget은 gUI에서 어떤 특정한 모양과 동작을 가지는 윈도우를 지칭
  • widget과 window라는 용어는 자주 혼용되어 사용
  • widget 형태에는 버튼, 스크롤바, 메뉴, 텍스트 윈도우 등이 포함
  • Tk는 또한 일반적으로 그림을 그리는 데 사용되는 캔버스라는 widget을 제공
  • X 윈도우 시스템은 윈도우의 계층적인 구성을 지원하는데, Tk도 이런 특성을 따름
  • 윈도우 계층 구조라는 것은 하나의 메인 윈도우가 있으며 그 안에 여러 개의 자식 윈도우가 포함
  • 자식 윈도우 또한 그 안에 여러 윈도우를 포함할 수 있음
  • widget은 형상 관리자(geometry manager)에 의해 그 크기와 위치가 조절됨
  • 형상 관리자가 widget에 대해 알게 되기 전에는 widget은 화면에 나타나지 않음
  • Tk에서는 여러 가지 형상 관리자를 사용할 수 있음
  • 본 예제에서는 주로 packer 형상 관리자를 사용
  • 주로 사용되는 기법은 프레임 widget을 다른 widget을 포함하는 데 사용
  • 하나 이상의 widget이 생성되고 프레임 widget에 형상 관리자에 의해 배치
  • Tk를 사용해 만든 프로그램은 이벤트에 의해 동작
  • 이벤트는 bind명령을 통해 Tcl 명령과 연결
  • X 프로토콜에 의해 정의된 이벤트에는 키보드와 마우스 입력을 포함한 여러가지가 있음
  • Tk widget은 기본적인 이벤트 처리기를 내장하기에 모든 사항을 프로그래밍할 필요 없음
  • 이벤트 바인딩은 전역 바인딩, 클래스 바인딩, 인스턴스 바인딩으로 분류
  • 클래스의 예로 모든 버튼을 나타내는 Button을 들 수 있음
  • Tk 툴킷은 Button 클래스와의 바인딩을 통해 버튼에 대한 동작을 정의하는 기본 바인딩을 제공
  • 프로그래머는 새로운 바인딩 그룹을 만들고 여러 바인딩을 묶을 수 있음
  • bindtags 명령은 바인딩 그룹을 관리하고 우선 순위를 정함
  • 바인딩과 관련된 개념으로 포커스(focus)를 들 수 있음
  • 어떤 때에도 하나의 widget은 입력 포커스를 가지며, 그 widget으로 키보드 입력이 전달
  • 마우스 포인터 바로 밑에 있는 widget에게 포커스를 주는 방법
    특정 widget에게 포커스를 주는 방법
  • Tk는 포커스를 바꿀 수 있는 명령을 제공
  • Tk 스크립트는 widget을 생성하고 형상 관리자를 사용해 widget들을 배치하며 widget에 대한 action을 정의하는 구조
  • wish를 소스 프로그램의 이름없이 실행시키면 빈 메인 윈도우를 하나 생성한 후 명령 라인 프롬프트를 출력

Hello, World

  • 버튼을 누르면 표준 출력에 “Hello, World!”라는 글자를 출력
  • Hello, World 스크립트는 버튼을 생성하고 버튼을 배치하는 두 부분으로 구성

button .hello -text Hello \
-command {puts stdout "Hello, World!"}
pack .hello -padx 20 -pady 10
  • button 명령은 .hello라는 이름을 가진 button을 생성
  • 버튼에 쓰일 글자는 Hello이며 연결된 명령은 “puts stdout “Hello, World!” 이다
  • pack 명령은 버튼을 화면에 보여준다
  • Tk는 widget을 생성하고 이름을 붙일 때 객체 기반 시스템을 사용
  • 각 widget 클래스는 그 클래스의 widget의 한 인스턴스를 생성하는 명령과 연결
  • 새로운 widget이 생성되면 새로운 그 인스턴스와 연결될 새로운 Tcl 명령이 정의
  • 위에서 만든 버튼은 .hello라는 이름을 사용해 접근할 수 있음
  • .hello 버튼을 깜빡거리게 하고 싶은 경우에는 아래의 명령을 이용
.hello flash
  • 버튼과 연결된 명령을 수행하기 위해서는 다음 명령을 수행
.hello invoke

Tk widget에 이름 붙이기

  • 버튼의 이름 앞에 붙은 점 기호는 필요
  • Tk는 widget의 이름이 widget 계층 구조에서의 위치를 반영할 수 있도록 함
  • 계층 구조의 루트는 메인 윈도우이며 그 윈도우의 이름은 ‘.’임
  • UNIX의 파일 시스템에서 ‘/’가 루트 디렉토리를 나타내는 동시에 디렉토리 이름을 구분하기 위해 사용되는 것과 유사
  • Tk는 UNIX 파일 시스템에서의 ‘/’와 비슷한 용도로 ‘,’을 사용
  • .hello 라는 widget은 메인 윈도우의 자식 윈도우를 나타내는 이름
  • .hello 라는 widget의 자식 윈도우를 만들고 싶다면 이름을 .hello.hi의 형식으로 하면 됨
  • Tk 경로명은 항상 소문자나 숫자로 시작해야 함
  • 어떤 widget을 다른 위치로 옮기고 싶은 경우에 widget의 이름을 변경해야 함
  • 직접 widget의 이름을 사용하지 않고 widget의 이름을 담는 변수를 이용하여 해결

Tk widget의 설정

  • widget의 속성 이름은 -로 시작
  • -로 시작하는 속성 이름 다음에 오는 파라미터가 그 속성의 속성값이 됨
  • 간단한 widget은 10개 내외의 속성을 가지며 복잡한 widget의 경우 20개 이상의 속성을 가짐
  • 속성값에는 기본값이 있으므로 필요한 속성만을 변경하면 됨
  • 각 widget 인스턴스는 속성을 얻어내고 바꿀 수 있는 configure연산을 지원
  • config 명령의 문법은 widget을 생성할 때 주는 속성과 똑같은 파라미터를 부여
  • 예를 들어 .hello 버튼의 배경 색을 빨간색으로 바꾸고 싶은 경우
button .hello -text Hello \
-command {puts stdout "Hello, World!"; .hello flash}
pack .hello -padx 20 -pady 10

.hello config -background red
  • 현재의 속성 값을 얻어내는 데에도 사용 가능
.hello config -background
#-background background Background SystemButtonFace red
  • 리턴값은 명령행 옵션, 자원의 이름, 클래스 이름, 기본값, 그리고 현재 값이 포함
  • 클래스와 리소스 이름은 X윈도우의 자원 관리 메커니즘과 관계가 있음
  • 현재의 값만을 얻어내기 위해서는 cget 연산을 수행
.hello cget -background
#red
  • widget 속성은 언제든지 바꿀 수 있음
  • 다음 명령은 .hello widget 버튼을 Goodbye! 버튼으로 변경
.hello config -text Goodbye! -command exit

Tk widget 속성과 X 자원

  • widget의 속성에 이름을 붙이는 방법에게 명령행 옵션, 이름, 클래스 세 가지가 있음
  • 명령행 옵션은 Tcl에서 사용하는 방법, 소문자이며 - 기호로 시작
  • 이름과 클래스로 widget 속성에 이름을 붙이는 것은 X 윈도우즈 시스템의 자원 명세서와 관련
  • 속성에 해당하는 자원의 이름 앞에 - 기호가 없고, 이름 중간중간에 대문자가 포함
  • 자원 클래스는 대문자로 시작하며 중간에 대문자가 있음
  • X에서는 네이밍 방법을 사용해 미리 정의된 속성에 이름이 있음
  • Tk와 함께 man page가 따라오기에 man page를 참고하는 것이 좋음 (UNIX 전용)
% man button

Tk 명령 종합

  • Tk에서 widget을 만들기 위해 사용하는 명령
    • button : 버튼 생성
    • checkbutton : Tcl 변수와 연결된 토글 할 수 있는 버튼 생성
    • radiobutton : radio 버튼 생성
    • menubutton : 메뉴를 호출 버튼 생성
    • menu : 메뉴 생성
    • canvas : 캔버스 생성
    • label : 텍스트 레이블 생성
    • entry : 한 줄의 입력을 받을 수 있는 widget 생성
    • message : 읽을 수만 있는 여러 줄의 텍스트 메시지를 생성
    • listbox : 리스트 박스 생성
    • text : 범용의 텍스트 widget 생성
    • scrollbar : 다른 widget과 연결되는 스크롤 바 생성
    • scale : 어떤 변수의 값을 설정할 때 사용되는 scale widget 생성
    • frame : 형상 관리자와 함께 사용하며 다른 widget을 포함하는 프레임 widget 생성
    • toplevel : X 윈도우의 새로운 top-level 프레임 생성
  • widget들을 다루는 여러 명령
    • after : 일정 시간이 지난 후에 특정 명령을 수행
    • bell : X 벨 장치를 통해 벨 울림
    • bind : Tcl 명령을 X 이벤트에 연결
    • bindtags : 바인딩 클래스를 생성하고 바인딩 상속을 제어
    • clipboard : X 클립보드를 사용
    • destroy : widget을 삭제
    • fileevent : Tcl 명령을 file descriptor와 연결
    • focus : 입력 포커스를 조절
    • grab : 다른 widget으로부터 입력 포커스를 획득
    • image : 이미지를 생성하고 다룸
    • raise : 윈도우의 스택 순서에서 윈도우를 위로 올림
    • lower : 윈도우의 스택 순서에서 윈도우를 밑으로 보냄
    • option : Xresources 데이터베이스에 접근
    • pack : 화면에 widget들을 배치
    • place : 화면에 위치를 주어 widget을 배치
    • selection : X PRIMARY selection을 다룸
    • send : Tcl 명령을 다른 Tk 응용에게 전송
    • tk : 응용 프로그램의 이름을 묻거나 설정
    • tkerror : 에러 처리
    • tkwait : 어떤 이벤트의 발생 대기
    • update : 이벤트 루프를 통해 화면 갱신
    • winfo : 윈도우의 상태에 대해 질의
    • wm : 윈도우 매니저와 상호 정보교환
728x90
728x90

'Programming > TclTk' 카테고리의 다른 글

TK Pack 형상 관리자  (0) 2022.09.13
TK 예제로 배우는 Tk  (0) 2022.09.08
TCL 스크립트 라이브러리  (0) 2022.09.06
TCL UNIX에서 작업하기  (0) 2022.09.06
TCL Eval  (0) 2022.09.05

댓글