tkinter — Tcl/Tk용 파이썬 인터페이스

tkinter — Tcl/Tk용 파이썬 인터페이스

tkinter 패키지("Tk interface")는 Tk GUI 툴킷에 대한 표준 파이썬 인터페이스예요. Tk와 tkinter는 대부분의 Unix 플랫폼과 Windows, macOS에서 사용할 수 있어요. 예를 들어 python -m tkinter를 실행하면 tkinter가 제대로 설치됐는지 확인할 수 있는 간단한 Tk 인터페이스를 열 수 있어요.

tkinter는 Tk 8.5 이상 버전을 요구하며 Tk 8.6에도 대응합니다. Tcl/Tk와 무관한 다른 GUI 툴킷에 대해서는 파이썬 위키의 GUI 프레임워크 목록을 참고하세요.

출처: Python 표준 라이브러리 — tkinter

본문

아키텍처 (Architecture)

Tk는 Tcl 커맨드 언어로 구성된 Tk 위젯들의 집합으로, Tk는 Tcl/Tk로 알려진 툴킷의 핵심 부분이에요. tkinter는 Tcl/Tk에 대한 얇은 객체지향 레이어(파이썬 클래스로 구현된 Tk 위젯)를 제공합니다. tkinter를 쓰면 Tcl 코드를 직접 쓸 필요는 없지만, 때로 Tk 문서(Tcl 문서 포함)를 참고할 필요는 있어요.

주요 클래스들

  • tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1) — 기본 Tk 위젯을 만들고, Tcl·Tk 클래스가 초기화한 전역 인터프리터 상태를 관리해요. 대부분의 애플리케이션에서 메인 윈도우인 최상위 위젯 클래스.
  • class tkinter.Tk — 루트 윈도우. 대부분 위젯은 이 인스턴스를 부모로 해서 생성돼요. Tk()를 호출하면 Tk 인터프리터가 초기화되고 기본 윈도우가 만들어집니다.
  • tkinter.Toplevel — 별도의 최상위 윈도우.
  • 위젯 클래스들Button, Canvas, Checkbutton, Entry, Frame, Label, Listbox, Menu, Menubutton, Message, Radiobutton, Scale, Scrollbar, Text, Spinbox, LabelFrame, PanedWindow 등. 각 위젯은 tkinter.<Widget>(parent, **options)로 생성해요.
  • 변수 클래스들StringVar, IntVar, DoubleVar, BooleanVar. 위젯 값을 스크립트에서 추적·변경하는 데 씁니다.
  • 이미지 클래스들tkinter.Image, tkinter.PhotoImage, tkinter.BitmapImage.

위젯 위계 (Widget hierarchy)

Tk에서 모든 위젯은 위젯 위계를 이룹니다. 루트 위젯은 Tk이고, 대부분의 위젯은 부모 위젯의 자식으로 생성됩니다. 위젯의 경로명(path name)은 parent.子widget처럼 점으로 구분된 조상 체인이에요. PathName 파라미터가 없는 곳에선 tkinter가 첫 번째 위젯 인자를 부모로 해 자동으로 pathname을 만들어요.

편리한 어트리뷰트

  • tkinter._test() — tkinter가 제대로 동작하는지 확인하는 테스트 함수.
  • tkinter.TclError — Tcl 인터프리터에서 발생한 예외.
  • 모듈 수준 함수tkinter.mainloop(), tkinter.quit(), tkinter.getboolean(s), tkinter.getdouble(s) 등.

헬로 월드 프로그램

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()
  • 지오메트리 관리 (geometry management) — 위젯을 어디에 배치할지 정하는 것. Tkinter에서 위젯을 배치할 때는 pack(), grid(), place() 메서드를 씁니다. 한 위젯에는 이 중 하나만 적용할 수 있어요. pack은 콤팩트한 블록 배치, grid는 행/열 기반 배치, place는 좌표 기반 배치를 합니다.
  • 옵션 설정 (Setting options) — 위젯의 옵션은 생성자 키워드(tk.Button(root, text="..."))로 설정하거나, 딕셔너리 스타일(btn["text"] = "...")로 설정할 수 있어요. config(**kwargs) 메서드로도 설정 가능합니다.
  • 위젯 변수 결합 (Coupling widget variables)StringVar 같은 변수를 위젯과 textvariable, variable 옵션으로 연결하면 위젯 값이 바뀔 때 변수도 함께 바뀌고, 변수를 바꾸면 위젯도 갱신됩니다.
  • 바인딩과 이벤트 (Bindings and events)widget.bind("<Button-1>", handler)처럼 이벤트 시퀀스 문자열과 핸들러 함수를 연결해 사용자 상호작용을 처리해요. 이벤트 핸들러는 event 객체를 하나 받습니다.
  • 쓰레딩 모델 (Threading model) — Tkinter가 파이썬에서 쓰일 때의 쓰레드 사용에 관한 참고 사항이 있습니다. GUI 이벤트 루프는 메인 스레드에서 도는 게 일반적이에요.

Reference (참조)

  • 기반·mixin 클래스tkinter.Misc(위젯 공통 기능), tkinter.Wm(윈도우 매니저 인터페이스).
  • Toplevel 위젯tkinter.Tk, tkinter.Toplevel.
  • 위젯 클래스 — 위에서 나열한 Button부터 PanedWindow까지의 모든 표준 위젯.
  • 변수 클래스StringVar, IntVar, DoubleVar, BooleanVar.
  • 이미지 클래스PhotoImage, BitmapImage.
  • 기타 클래스Text 위젯의 인덱스·태그 관련, 스크롤바 등.
  • 모듈 수준 함수mainloop(), quit(), getboolean(), getdouble() 등.
  • 상수 (Constants)tkinter.TkVersion, tkinter.TclVersion, 기타 상수들.

더 알아보기