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 프레임워크 목록을 참고하세요.
본문
아키텍처 (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, 기타 상수들.