tkinter — Tcl/Tk 파이썬 인터페이스¶
소스 코드: Lib/tkinter/__init__.py
tkinter 패키지(“Tk 인터페이스”)는 Tcl/Tk GUI 툴킷에 대한 표준 파이썬 인터페이스입니다. Tk와 tkinter\는 macOS를 포함하는 대부분의 유닉스 플랫폼과 윈도우 시스템에서 사용할 수 있습니다.
명령줄에서 python -m tkinter 를 실행하면 간단한 Tk 인터페이스를 시연하는 창을 열어, tkinter 가 시스템에 제대로 설치되었는지 알 수 있게 하며, 또한 어떤 버전의 Tcl/Tk가 설치되었는지 보여주므로, 해당 버전에 맞는 Tcl/Tk 문서를 읽을 수 있습니다.
Tkinter는 스레드 지원 유무에 관계없이 다양한 Tcl/Tk 버전을 지원합니다. 공식 Python 바이너리 릴리스는 Tcl/Tk 8.6 스레드 버전을 번들로 제공합니다. 지원되는 버전에 대한 더 많은 정보는 _tkinter 모듈의 소스 코드를 참조하십시오.
Tkinter는 얇은 래퍼가 아니며, 경험을 더욱 파이썬답게 만들기 위해 상당한 양의 고유 로직을 추가합니다. 이 문서는 이러한 추가 기능과 변경 사항에 초점을 맞추며, 변경되지 않은 세부 사항에 대해서는 공식 Tcl/Tk 문서를 참조합니다.
참고
Tcl/Tk 8.5 (2007)는 현대적인 테마의 사용자 인터페이스 구성 요소 세트와 이를 사용하기 위한 새 API를 도입했습니다. 구형 API와 신형 API 모두 여전히 사용할 수 있습니다. 온라인에서 찾을 수 있는 대부분의 문서는 여전히 구형 API를 사용하고 있어 심각하게 구식이 될 수 있습니다.
This is an optional module. If it is missing from your copy of CPython, look for documentation from your distributor (that is, whoever provided Python to you). If you are the distributor, see 선택적 모듈 요구사항.
더 보기
- TkDocs
Tkinter를 사용하여 사용자 인터페이스를 생성하는 방법에 대한 광범위한 튜토리얼입니다. 주요 개념을 설명하고, 최신 API를 사용하는 권장 접근 방식을 보여줍니다.
- Tkinter 8.5 reference: a GUI for Python
사용 가능한 클래스, 메서드 및 옵션을 자세히 설명하는 Tkinter 8.5에 대한 참조 문서입니다.
Tcl/Tk 리소스:
- Tk commands
Tkinter가 사용하는 기본 Tcl/Tk 명령에 대한 포괄적인 참조입니다.
- Tcl/Tk 홈 페이지
추가 문서 및 Tcl/Tk 코어 개발 링크입니다.
도서:
- Modern Tkinter for Busy Python Developers
Mark Roseman 지음. (ISBN 978-1999149567)
- Python GUI programming with Tkinter
Alan D. Moore 지음. (ISBN 978-1788835886)
- Programming Python
Mark Lutz 지음; 탁월하게 Tkinter를 다루고 있습니다. (ISBN 978-0596158101)
- Tcl and the Tk Toolkit (2nd edition)
John Ousterhout가 Tcl/Tk의 발명가이며, Ken Jones가 공동 저자로 작성했습니다. Tkinter는 다루지 않습니다. (ISBN 978-0321336330)
아키텍처¶
Tcl/Tk은 단일 라이브러리가 아니라, 각각 독립적인 기능과 자체 공식 문서를 가진 몇 개의 개별 모듈로 구성됩니다. Python의 바이너리 릴리스 또한 모듈과 함께 추가 모듈을 포함하여 제공합니다.
- Tcl
Tcl은 Python과 마찬가지로 동적 인터프리터 언어입니다. 범용 프로그래밍 언어 자체로도 사용될 수 있지만, 가장 일반적으로는 C 애플리케이션에 스크립팅 엔진이나 Tk 툴킷으로의 인터페이스로 임베드됩니다. Tcl 라이브러리는 Tcl 인터프리터의 하나 이상을 생성하고 관리하며, 해당 인스턴스에서 Tcl 명령과 스크립트를 실행하고, Tcl이나 C로 구현된 사용자 정의 명령을 추가하기 위한 C 인터페이스를 제공합니다. 각 인터프리터는 이벤트 큐를 가지며, 이벤트 전송 및 처리를 위한 시설을 갖추고 있습니다. Python과 달리, Tcl의 실행 모델은 협조적 멀티태스킹을 기반으로 설계되었으며, Tkinter가 이 차이점을 연결합니다 (자세한 내용은 Threading model 을 참조하십시오).
- Tk
Tk is a Tcl package implemented in C that adds custom commands to create and manipulate GUI widgets. Each
Tkobject embeds its own Tcl interpreter instance with Tk loaded into it. Tk’s widgets are very customizable, though at the cost of a dated appearance. Tk uses Tcl’s event queue to generate and process GUI events.- Ttk
Themed Tk (Ttk)는 여러 클래식 Tk 위젯보다 다양한 플랫폼에서 훨씬 더 나은 외관을 제공하는 최신 Tk 위젯 제품군입니다. Ttk는 Tk 버전 8.5부터 포함되는 형태로 배포됩니다. Python 바인딩은 별도의 모듈인 `:mod:`tkinter.ttk`에서 제공합니다.
내부적으로 Tk와 Ttk는 기본 운영 체제(OS)의 기능을 사용합니다. 즉, Unix/X11에서는 Xlib, macOS에서는 Cocoa, Windows에서는 GDI를 사용합니다.
Python 애플리케이션이 Tkinter의 클래스, 예를 들어 위젯을 생성하는 데 해당 클래스를 사용할 경우, :mod:!tkinter` 모듈은 먼저 Tcl/Tk 명령 문자열을 조립합니다. 이 Tcl 명령 문자열을 내부 :mod:`_tkinter 바이너리 모듈로 전달하고, 이 모듈은 Tcl 인터프리터를 호출하여 평가합니다. Tcl 인터프리터는 이후 Tk 및/또는 Ttk 패키지를 호출하며, 이 패키지들 차례로 Xlib, Cocoa 또는 GDI로 호출합니다.
Tkinter 모듈¶
Tkinter에 대한 지원은 여러 모듈에 분산되어 있습니다. 대부분의 애플리케이션은 기본 :mod:!tkinter` 모듈과, 현대적인 테마 위젯 세트와 API를 제공하는 :mod:`tkinter.ttk 모듈이 필요합니다.
from tkinter import *
from tkinter import ttk
- class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)¶
최상위 Tk 위젯을 만들고 이 위젯에 대한 Tcl 인터프리터를 초기화합니다. 이 위젯은 일반적으로 응용 프로그램의 메인 창입니다. 인스턴스마다 고유한 Tcl 인터프리터가 연결됩니다.
The
Tk클래스는 일반적으로 모든 기본값을 사용하여 인스턴스화됩니다. 하지만 현재 인식되는 키워드 인수는 다음과 같습니다:- screenName
문자열로 주어지면, :envvar:`DISPLAY 환경 변수를 설정합니다. (X11에서만)
- baseName
프로필 파일의 이름입니다. 기본적으로, baseName 은 프로그램 이름(
sys.argv[0])으로부터 파생됩니다.- className
위젯 클래스의 이름입니다. 프로필 파일로 사용되며, Tcl이 호출되는 이름(interp*의 *argv0)으로도 사용됩니다.
- useTk
True`인 경우, Tk 하위 시스템을 초기화합니다. `:func:`tkinter.Tcl() <Tcl> 함수는 이를 `False`로 설정합니다.
- sync
`True`인 경우, 모든 X 서버 명령을 동기적으로 실행하여 오류가 즉시 보고되게 합니다. 디버깅에 사용할 수 있습니다. (X11에서만)
- use
애플리케이션을 포함할 창의 id 를 지정합니다. 이 경우 독립적인 최상위 창으로 생성되지 않습니다. id 는 최상위 위젯의 -use 옵션 값과 동일한 방식으로 지정되어야 합니다 (즉,
winfo_id()가 반환하는 형식과 유사합니다).일부 플랫폼에서는 id 가 -container 옵션이 활성화된 Tk 프레임 또는 최상위 창을 참조할 때만 올바르게 작동한다는 점에 유의하십시오.
:class:`Tk`는 `:file:.{className}.tcl` 및 :file:.{baseName}.tcl`로 이름 붙은 프로필 파일을 읽고 해석하여 Tcl 인터프리터에 넣고, :file:.{className}.py`와 :file:.{baseName}.py`의 내용을 :func:`exec``을 호출합니다. 프로필 파일의 경로는 `:envvar:`HOME 환경 변수이거나, 정의되어 있지 않은 경우 `:data:`os.curdir``입니다.
- tk¶
:class:`Tk`를 인스턴스화하여 생성된 Tk 애플리케이션 객체입니다. 이는 Tcl 인터프리터에 대한 접근을 제공합니다. `:class:`Tk 인스턴스가 연결된 각 위젯은 :attr:`tk 속성에 동일한 값을 가집니다.
- tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)¶
Tcl()함수는 Tk 서브 시스템을 초기화하지 않는다는 것을 제외하고는,Tk클래스에 의해 만들어지는 것과 비슷한 객체를 만드는 팩토리 함수입니다. 불필요한 최상위 창을 만들고 싶지 않거나 만들 수 없는 (가령 X 서버가 없는 유닉스/리눅스 시스템) 환경에서 Tcl 인터프리터를 구동할 때 가장 유용합니다.Tcl()객체에 의해 만들어진 객체는loadtk()메서드를 호출하여 만들어지는 최상위 창(과 초기화된 Tk 서브 시스템)을 가질 수 있습니다.
Tk 지원을 제공하는 모듈은 다음과 같습니다:
tkinter주 Tkinter 모듈.
tkinter.colorchooser사용자가 색상을 선택할 수 있게 하는 대화 상자.
tkinter.commondialog여기에 나열된 다른 모듈에 정의된 대화 상자의 베이스 기본 클래스.
tkinter.filedialog사용자가 열거나 저장할 파일을 지정할 수 있도록 하는 일반 대화 상자입니다.
tkinter.font글꼴과 관련된 작업에 도움이 되는 유틸리티.
tkinter.messagebox표준 Tk 대화 상자에 액세스합니다.
tkinter.scrolledtext세로 스크롤 막대가 내장된 Text 위젯.
tkinter.simpledialog기본 대화 상자와 편리 함수.
tkinter.ttkTk 8.5에 도입되어, 메인
tkinter모듈의 많은 클래식 위젯에 대한 현대적인 대안을 제공하는 테마 위젯 세트입니다.
추가 모듈:
_tkinterTcl/Tk에 대한 저수준 인터페이스를 포함하는 바이너리 모듈입니다. 메인
tkinter모듈에 의해 자동으로 임포트되며, 응용 프로그램 프로그래머가 직접 사용해서는 안 됩니다. 일반적으로 공유 라이브러리(또는 DLL)이지만, 특정 경우에는 파이썬 인터프리터에 정적으로 링크될 수도 있습니다.idlelibPython의 통합 개발 및 학습 환경(IDLE)입니다. :mod:`!tkinter`를 기반으로 합니다.
tkinter.constantsTkinter 호출에 다양한 매개변수를 전달할 때 문자열 대신 사용할 수 있는 기호 상수입니다. 메인
tkinter모듈에 의해 자동으로 임포트됩니다.tkinter.dnd(실험적) :mod:`!tkinter`에 대한 드래그 앤드 드롭 지원입니다. Tk DND로 대체되면 폐지됩니다.
turtleTk 창에서의 터틀(turtle) 그래픽.
Tkinter 구명조끼¶
이 절은 Tk나 Tkinter 모두에 대한 포괄적인 튜토리얼을 제공하기 위한 것은 아닙니다. 그 대신, Tkinter 애플리케이션이 어떤 모습인지에 대한 아주 빠른 오리엔테이션을 제공하고, 기초적인 Tk 개념을 식별하며, Tkinter 래퍼가 어떻게 구성되어 있는지 설명합니다.
이 섹션의 나머지는 Tkinter 애플리케이션에서 필요할 클래스, 메서드, 옵션을 식별하는 데 도움이 될 것이며, 공식 Tcl/Tk 참조 매뉴얼을 포함하여 더 자세한 문서를 찾을 수 있는 위치를 알려줄 것입니다.
Hello World 프로그램¶
Tkinter에서 “Hello World” 애플리케이션을 단계별로 살펴보면서 시작하겠습니다. 우리가 작성할 수 있는 가장 작은 예시는 아니지만, 알아야 할 몇 가지 핵심 개념을 설명하기에는 충분합니다.
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
임포트 후에 다음 줄은 Tk 클래스의 인스턴스를 생성하여 Tk를 초기화하고 관련 Tcl 인터프리터를 생성합니다. 또한 애플리케이션의 메인 창 역할을 하는 루트 창으로 알려진 최상위 창도 생성합니다.
다음 줄은 프레임 위젯을 생성하며, 여기서는 다음에서 만들 레이블과 버튼을 포함할 것입니다. 이 프레임은 루트 창 안에 배치됩니다.
다음 줄은 정적 텍스트 문자열을 담고 있는 레이블 위젯을 생성합니다. grid() 메서드는 HTML 테이블처럼 레이블의 포함 프레임 위젯 내에서 상대적인 레이아웃(위치)을 지정하는 데 사용됩니다.
다음으로 버튼 위젯을 생성하고 레이블 오른쪽에 배치합니다. 버튼을 누르면 루트 창의 destroy() 메서드를 호출하게 됩니다.
마지막으로, mainloop() 메서드는 모든 것을 디스플레이에 표시하고 프로그램이 종료될 때까지 사용자 입력을 처리합니다.
중요한 Tk 개념¶
심지어 이 간단한 프로그램은 다음과 같은 주요 Tk 개념들을 보여줍니다:
- 위젯
Tkinter 사용자 인터페이스는 개별 위젯 들로 구성됩니다. 각 위젯은
ttk.Frame,ttk.Label, 및ttk.Button과 같은 클래스로 인스턴스화된 Python 객체로 표현됩니다.- 위젯 계층 구조
위젯들은 계층 구조*로 배열됩니다. 레이블과 버튼은 프레임 안에 포함되었고, 그 프레임은 다시 루트 창 안에 포함되었습니다. 각 *자식 위젯을 생성할 때, 해당 부모 위젯이 위젯 생성자의 첫 번째 인자로 전달됩니다.
- 구성 옵션
위젯은 모양과 동작을 수정하는 구성 옵션 을 가지고 있으며, 레이블이나 버튼에 표시되는 텍스트 등이 있습니다. 다른 클래스의 위젯들은 서로 다른 옵션 세트를 가집니다.
- 지오메트리 관리
위젯을 생성한다고 해서 사용자 인터페이스에 자동으로 추가되는 것은 아닙니다.
grid와 같은 지오메트리 관리자 가 사용자 인터페이스의 어디에 배치되는지를 제어합니다.- 이벤트 루프
Tkinter는 사용자 입력, 프로그램의 변경 사항, 심지어 디스플레이 새로고침까지 이벤트 루프 를 활발하게 실행할 때만 반응합니다. 프로그램이 이벤트 루프를 실행하고 있지 않으면 사용자 인터페이스가 업데이트되지 않습니다.
Tkinter가 Tcl/Tk를 래핑하는 방법 이해하기¶
애플리케이션이 Tkinter의 클래스와 메서드를 사용할 때, 내부적으로 Tkinter는 Tcl/Tk 명령을 나타내는 문자열을 조립하고, 애플리케이션의 Tk 인스턴스에 연결된 Tcl 인터프리터에서 해당 명령을 실행합니다.
참조 문서를 탐색하려고 하든, 올바른 메서드나 옵션을 찾으려고 하든, 기존 코드를 조정하든, Tkinter 애플리케이션을 디버깅하든, 그 근본적인 Tcl/Tk 명령이 어떻게 생겼는지를 이해하는 것이 유용할 때가 있습니다.
예를 들어, 여기에 위의 Tkinter 스크립트의 주요 부분에 해당하는 Tcl/Tk 등가물이 있습니다.
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
Tcl의 문법은 많은 셸 언어와 유사하여, 첫 번째 단어는 실행할 명령이고 그 뒤에 공백으로 구분된 인자들이 따라옵니다. 너무 많은 세부 사항을 다루지 않더라도 다음 사항을 주목하십시오:
위젯을 생성하는 데 사용되는 명령(예:
ttk::frame)은 Tkinter의 위젯 클래스에 해당합니다.Tcl 위젯 옵션(예:
-text)은 Tkinter의 키워드 인자와 대응합니다.Tcl에서는 위젯이 경로명 (예:
.frm.btn)으로 참조되는 반면, Tkinter는 이름을 사용하지 않고 객체 참조를 사용합니다.위젯의 위계 구조에서의 위치는 경로명(hierarchy name)에 인코딩되어 있으며, 여기서 경로는 구분자로
.(점)을 사용합니다. 루트 창의 경로명은 단순히.(점)입니다. Tkinter에서는 계층 구조가 경로명으로 정의되는 것이 아니라, 각 자식 위젯을 생성할 때 부모 위젯을 지정하여 정의됩니다.Tcl에서는 별도의 명령어 로 구현되는 작업(예:
grid또는destroy)은 Tkinter 위젯 객체의 메서드 로 표현됩니다. 곧 보게 되겠지만, Tcl은 다른 시점에서는 위젯 객체에서 메서드 호출처럼 보이는 것을 사용하며, 이는 Tkinter에서 사용되는 것과 더 가깝습니다.
~가요…? 무엇이…?¶
Tkinter에서 무언가를 어떻게 해야 할지 확실하지 않고, 사용 중인 튜토리얼이나 참조 문서에서 바로 찾을 수 없다면, 도움이 될 수 있는 몇 가지 전략이 있습니다.
먼저, 개별 위젯의 작동 방식에 대한 세부 사항이 Tkinter와 Tcl/Tk의 여러 버전에서 다를 수 있음을 기억하십시오. 문서를 검색하는 경우, 시스템에 설치된 Python 및 Tcl/Tk 버전에 해당하는지 확인하십시오.
API를 사용하는 방법을 검색할 때는 사용하고 있는 클래스, 옵션 또는 메서드의 정확한 이름을 아는 것이 도움이 됩니다. 대화형 Python 셸에서든 :func:`print`에서든, 검색(Introspection)을 통해 필요한 것이 무엇인지 식별할 수 있습니다.
모든 위젯에서 사용 가능한 구성 옵션을 찾으려면, configure() 메서드를 호출하십시오. 이 메서드는 기본값과 현재 값을 포함하여 각 객체에 대한 다양한 정보를 담은 딕셔너리를 반환합니다. 각 옵션의 이름만 가져오려면 :meth:`keys`를 사용하십시오.
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
대부분의 위젯은 많은 공통 구성 옵션을 가지고 있으므로, 특정 위젯 클래스에만 있는 것이 무엇인지 아는 것이 유용할 수 있습니다. 프레임과 같은 더 간단한 위젯 목록과 옵션 목록을 비교하는 것이 한 가지 방법입니다.
print(set(btn.configure().keys()) - set(frm.configure().keys()))
마찬가지로, 표준 dir() 함수를 사용하여 위젯 객체에 대한 사용 가능한 메서드를 찾을 수 있습니다. 시도해 보면 200개가 넘는 공통 위젯 메서드가 있다는 것을 알 수 있으므로, 역시 특정 위젯 클래스에 특화된 것을 식별하는 것이 도움이 됩니다.
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
스레딩 모델¶
Python과 Tcl/Tk는 매우 다른 스레딩 모델을 가지며, :mod:`!tkinter`가 이를 연결하려고 시도합니다. 스레드를 사용하려면 이 점을 인지해야 할 수도 있습니다.
Python 인터프리터는 자신과 연결된 여러 스레드를 가질 수 있습니다. Tcl에서는 여러 스레드를 생성할 수 있지만, 각 스레드는 자체의 Tcl 인터프리터 인스턴스를 가집니다. 스레드는 또한 여러 개의 인터프리터 인스턴스를 생성할 수도 있지만, 각 인터프리터 인스턴스는 이를 생성한 단 하나의 스레드만 사용할 수 있습니다.
tkinter`에 의해 생성된 각 :class:`Tk 객체는 Tcl 인터프리터를 포함합니다. 또한 해당 인터프리터를 생성한 스레드를 추적합니다. tkinter 호출은 모든 Python 스레드에서 수행될 수 있습니다. 내부적으로, 호출이 Tk 객체를 생성한 스레드가 아닌 다른 스레드에서 오는 경우, 이벤트가 인터프리터의 이벤트 큐에 게시되고, 실행될 때 결과는 호출하는 Python 스레드로 반환됩니다.
Tcl/Tk 애플리케이션은 일반적으로 이벤트 기반(event-driven)입니다. 즉, 초기화 후에 인터프리터는 이벤트 루프(예: Tk.mainloop())를 실행하고 이벤트에 응답합니다. 단일 스레드이기 때문에 이벤트 핸들러는 빠르게 응답해야 하며, 그렇지 않으면 다른 이벤트 처리를 차단할 수 있습니다. 이를 피하기 위해, 오래 실행되는 계산은 이벤트 핸들러에서 실행되어서는 안 되며, 타이머를 사용해서 더 작은 조각으로 나누거나 다른 스레드에서 실행해야 합니다. 이는 GUI가 이벤트 핸들러를 포함한 모든 애플리케이션 코드와 완전히 별도의 스레드에서 실행되는 많은 GUI 툴킷과는 다릅니다.
Tcl 인터프리터가 이벤트 루프를 실행하고 이벤트를 처리하지 않는 경우, Tcl 인터프리터를 실행하는 스레드가 아닌 다른 스레드에서 이루어지는 모든 tkinter 호출은 실패합니다.
일부 특별한 경우가 존재합니다:
Tcl/Tk 라이브러리는 스레드 인식 방식으로 빌드될 수 없습니다. 이 경우, :mod:`!tkinter`는 Tcl 인터프리터를 생성한 스레드와 다르더라도 원래의 Python 스레드에서 라이브러리를 호출합니다. 전역 잠금(global lock)은 한 번에 하나의 호출만 발생하도록 보장합니다.
tkinter`는 하나의 :class:`Tk객체(독립적인 인터프리터를 포함)를 여러 개 생성할 수 있도록 허용하지만, 같은 스레드의 모든 인터프리터는 공통 이벤트 큐를 공유하며, 이는 빠르게 복잡해집니다. 실제로는 한 번에Tk인스턴스를 하나 이상 생성하지 않도록 하는 것이 좋습니다. 그렇지 않다면, 각각을 별도의 스레드에서 생성하고 스레드 인식을 하는 Tcl/Tk 빌드를 사용하는 것이 가장 좋습니다.이벤트 핸들러를 차단하는 것이 Tcl 인터프리터가 이벤트 루프를 재진입하는 것을 막는 유일한 방법은 아닙니다. 여러 개의 중첩된 이벤트 루프를 실행하거나 이벤트 루프 자체를 완전히 포기하는 것도 가능합니다. 이벤트나 스레드와 관련하여 까다로운 작업을 처리한다면, 이러한 가능성을 염두에 두어야 합니다.
현재 :mod:`!tkinter`에는 Tcl 인터프리터를 생성한 스레드에서 호출할 때만 작동하는 몇 가지 선택적인 함수가 있습니다.
간편한 레퍼런스¶
옵션 설정¶
옵션은 위젯의 색상과 테두리 너비와 같은 것을 제어합니다. 옵션은 세 가지 방법으로 설정할 수 있습니다:
- 객체 생성 시, 키워드 인자 사용하기
fred = Button(self, fg="red", bg="blue")
- 객체 생성 후, 딕셔너리 인덱스처럼 옵션 이름을 다루기
fred["fg"] = "red" fred["bg"] = "blue"
- config() 메서드를 사용하여 객체 생성 이후 여러 어트리뷰트를 갱신하기.
fred.config(fg="red", bg="blue")
주어진 옵션과 그 동작에 대한 완전한 설명은, 해당 위젯의 Tk 매뉴얼 페이지를 참조하십시오.
매뉴얼 페이지는 각 위젯에 대해 “표준 옵션(STANDARD OPTIONS)”과 “위젯 특정 옵션(WIDGET SPECIFIC OPTIONS)”을 나열합니다. 전자는 많은 위젯에 공통적인 옵션 목록이며, 후자는 그 위젯에만 적용되는 옵션입니다. 표준 옵션은 options(3) 매뉴얼 페이지에 설명되어 있습니다.
이 문서에서는 표준과 위젯 특정 옵션을 구분하지 않습니다. 일부 옵션은 일부 위젯에 적용되지 않습니다. 특정 위젯이 특정 옵션에 응답하는지는 위젯의 클래스에 따라 다릅니다; 버튼에는 command 옵션이 있는데, 레이블은 그렇지 않습니다.
주어진 위젯이 지원하는 옵션은 위젯의 매뉴얼 페이지에 나열되거나, 실행 시간에 인자 없이 config() 메서드를 호출하거나 해당 위젯에서 keys() 메서드를 호출하여 조회할 수 있습니다. 이러한 호출의 반환 값은 키가 옵션의 이름인 문자열(예를 들어, 'relief')이고 값이 5-튜플인 딕셔너리입니다.
bg와 같은 일부 옵션은 긴 이름을 가진 공통 옵션의 동의어입니다 (bg는 “background”의 줄임말입니다). config() 메서드에 줄인 옵션을 전달하면 5-튜플이 아닌 2-튜플을 반환합니다. 전달된 2-튜플에는 동의어의 이름과 “실제” 옵션이 담겨있습니다 (가령 ('bg', 'background')).
인덱스 |
의미 |
예 |
|---|---|---|
0 |
옵션 이름 |
|
1 |
데이터베이스 조회를 위한 옵션 이름 |
|
2 |
데이터베이스 조회를 위한 옵션 클래스 |
|
3 |
기본값 |
|
4 |
현재 값 |
|
예:
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
물론, 인쇄된 딕셔너리에는 사용 가능한 모든 옵션과 해당 값이 포함됩니다. 이것은 예시일뿐입니다.
패커¶
패커(packer)는 Tk의 지오메트리 관리 메커니즘 중 하나입니다. 지오메트리 관리자는 위젯들이 자신의 컨테이너 내에서 상대적인 위치 지정에 사용됩니다. 사용 빈도가 적고 여기서는 다루지 않는 더 번거로운 placer*와는 달리, 패커는 *위에, 왼쪽에, 채우기 등의 정성적(qualitative) 관계 규정을 취하고, 여러분을 위해 정확한 배치 좌표를 결정하기 위한 모든 작업을 수행합니다.
임의의 컨테이너 위젯 크기는 그 안에 있는 “콘텐츠 위젯”의 크기에 의해 결정됩니다. 패커는 콘텐츠 위젯이 패킹되는 컨테이너 내부에 어디에 나타날지 제어하는 데 사용됩니다. 원하는 레이아웃을 얻기 위해 위젯을 프레임에, 프레임을 다른 프레임에 패킹할 수 있습니다. 또한, 일단 패킹되면, 구성의 점진적인 변경을 수용하기 위해 배열이 동적으로 조정됩니다.
위젯은 지오메트리 관리자로 지오메트리를 지정할 때까지 표시되지 않습니다. 지오메트리 명세를 빠뜨리는 것은 초기에 흔한 실수이고, 위젯을 만들었지만, 아무것도 나타나지 않을 때 놀라게 됩니다. 위젯은 예를 들어 패커의 pack() 메서드가 적용된 후에만 나타납니다.
pack() 메서드는 컨테이너 내에서 위젯이 표시되는 위치와 메인 응용 프로그램 윈도우의 크기가 조정될 때 어떻게 동작할지를 제어하는 키워드 옵션/값 쌍으로 호출할 수 있습니다. 여기 몇 가지 예가 있습니다:
fred.pack() # 기본값은 side = "top"
fred.pack(side="left")
fred.pack(expand=1)
패커 옵션¶
패커와 그것이 받을 수 있는 옵션에 대한 더 자세한 정보는 매뉴얼 페이지와 John Ousterhout의 책의 183쪽을 참조하십시오.
- anchor
앵커(Anchor) 유형. 패커가 각 콘텐츠(content)를 해당 구획(parcel)에 놓을 위치를 나타냅니다.
- expand
불리언(boolean),
0또는1.- fill
유효한 값:
'x','y','both','none'.- ipadx와 ipady
거리(distance) - 콘텐츠의 각 변에 내부 패딩을 지정합니다.
- padx와 pady
거리(distance) - 콘텐츠의 각 변에 외부 패딩을 지정합니다.
- side
유효한 값:
'left','right','top','bottom'.
위젯 변수 결합하기¶
(텍스트 입력 위젯과 같은) 일부 위젯의 현재 값 설정은 특수 옵션을 사용하여 응용 프로그램 변수에 직접 연결할 수 있습니다. 이 옵션은 variable, textvariable, onvalue, offvalue 및 value입니다. 이 연결은 양방향으로 작동합니다: 어떤 이유로 든 변수가 변경되면, 연결된 위젯은 새 값을 반영하도록 갱신됩니다.
불행하게도, 현재 tkinter`의 구현에서는 ``variable` 또는 textvariable 옵션을 통해 임의의 파이썬 변수를 위젯으로 넘기기가 불가능합니다. 작동하는 변수의 유일한 종류는 :mod:`!tkinter`에 정의된 Variable이라는 클래스에서 상속받는 변수들입니다.
이미 정의된 Variable의 유용한 서브 클래스가 많이 있습니다: StringVar, IntVar, DoubleVar 및 BooleanVar. 이러한 변수의 현재 값을 읽으려면 get() 메서드를 호출하고, 값을 바꾸려면 set() 메서드를 호출합니다. 이 프로토콜을 따르면, 여러분이 더는 개입하지 않더라도 위젯은 변수의 값을 항상 추적합니다.
예를 들면:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.entrythingy = tk.Entry()
self.entrythingy.pack()
# 여기에 응용 프로그램 변수를 만듭니다.
self.contents = tk.StringVar()
# 어떤 값으로 설정합니다
self.contents.set("this is a variable")
# Entry 위젯에 이 변수를 감시하도록 지시합니다.
self.entrythingy["textvariable"] = self.contents
# 사용자가 return 키를 눌렀을 때를 위한 콜백을 정의합니다.
# 변수의 현재값을 인쇄합니다.
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("Hi. The current entry content is:",
self.contents.get())
root = tk.Tk()
myapp = App(root)
myapp.mainloop()
창 관리자¶
Tk에는 창 관리자와 상호 작용하기 위한 유틸리티 명령인 wm``이 있습니다. ``wm 명령어 옵션은 제목, 배치, 아이콘 비트맵 등을 제어할 수 있도록 합니다. tkinter`에서는 이러한 명령어들이 :class:`Wm 클래스에 메서드로 구현되었습니다. Toplevel 위젯은 Wm 클래스로부터 상속받기 때문에, Wm 메서드를 직접 호출할 수 있습니다.
주어진 위젯을 포함하는 최상위 창을 얻으려면, 종종 위젯의 master`를 참조하는 것만으로도 충분합니다. 물론 위젯이 프레임 안에 패킹되었다면, :attr:!master`는 최상위 창을 나타내지 않습니다. 임의의 위젯이 포함된 최상위 창을 얻으려면, _root() 메서드를 호출할 수 있습니다. 이 메서드는 이 함수가 구현 일부이며, Tk 기능에 대한 인터페이스가 아님을 나타내기 위해 밑줄로 시작합니다.
다음은 일반적인 사용 예입니다:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# 응용 프로그램을 만듭니다
myapp = App()
#
# 이것들은 창 관리자 클래스에 대한 메서드 호출입니다
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# 프로그램을 시작합니다
myapp.mainloop()
Tk 옵션 데이터형¶
- anchor
유효한 값은 나침반의 눈금입니다:
"n","ne","e","se","s","sw","w","nw", 그리고"center".- bitmap
8개의 내장된, 이름있는 비트맵이 있습니다:
'error','gray25','gray50','hourglass','info','questhead','question','warning'. X 비트맵 파일명을 지정하려면"@/usr/contrib/bitmap/gumby.bit"처럼@를 앞에 붙인 파일의 전체 경로를 지정하십시오.- boolean
정수 0이나 1 또는 문자열
"yes"나"no"를 전달할 수 있습니다.- callback
인자를 취하지 않는 파이썬 함수입니다. 예를 들면:
def print_it(): print("hi there") fred["command"] = print_it
- color
색상은 rgb.txt 파일에 있는 X 색상의 이름이나, RGB 값을 4비트:
"#RGB", 8비트:"#RRGGBB", 12비트:"#RRRGGGBBB", 또는 16비트:"#RRRRGGGGBBBB"범위로 표현하는 문자열로 제공됩니다. 여기서 R, G, B는 유효한 임의의 16진수를 나타냅니다. 자세한 내용은 Ousterhout의 책 160쪽을 참조하십시오.- cursor
XC_접두사 없이cursorfont.h의 표준 X 커서 이름을 사용할 수 있습니다. 예를 들어, 손 모양 커서(XC_hand2)를 얻으려면,"hand2"문자열을 사용하십시오. 여러분 자신의 비트맵과 마스크 파일을 지정할 수도 있습니다. Ousterhout의 책 179쪽을 보십시오.- distance
화면 거리는 픽셀이나 절대 거리로 지정할 수 있습니다. 픽셀은 숫자로 절대 거리는 문자열로 지정되며, 끝에 붙는 문자는 단위를 나타냅니다:
c는 센티미터,i는 인치,m은 밀리미터,p는 프린터의 포인트입니다. 예를 들어, 3.5 인치는"3.5i"로 표현됩니다.- font
Tk는
{courier 10 bold}와 같은, 목록 글꼴 이름 형식을 사용합니다. 양수로 표현된 글꼴 크기는 포인트로 측정됩니다; 음수로 표현된 크기는 픽셀 단위로 측정됩니다.- geometry
이것은
너비x높이형식의 문자열로, 대부분의 위젯에서 너비와 높이는 픽셀 단위로 측정됩니다 (텍스트를 표시하는 위젯에서는 문자 단위). 예를 들어:fred["geometry"] = "200x100".- justify
유효한 값은 문자열입니다:
"left","center", 및"right".- region
이것은 스페이스로 구분된 네 개의 요소가 있는 문자열이며, 각 요소는 유효한 거리(위를 참조하세요)입니다. 예를 들어:
"2 3 4 5"와"3i 2i 4.5i 2i"와"3c 2c 4c 10.43c"는 모두 유효한 영역(region)입니다.- relief
위젯의 테두리 스타일을 결정합니다. 유효한 값은 다음과 같습니다:
"raised","sunken","flat","groove"및"ridge".- scrollcommand
이것은 거의 항상 어떤 스크롤 막대 위젯의
set()메서드이지만, 단일 인자를 취하는 어떤 위젯 메서드도 가능합니다.- wrap
"none","char"또는"word"중 하나여야 합니다.
바인딩과 이벤트¶
위젯 명령의 bind 메서드를 사용하면 특정 이벤트를 감시하고 해당 이벤트 유형이 발생할 때 콜백 함수가 트리거 되도록 할 수 있습니다. bind 메서드의 형식은 다음과 같습니다:
def bind(self, sequence, func, add=''):
여기에서:
- sequence
는 대상 이벤트의 종류를 나타내는 문자열입니다. (자세한 내용은 bind(3tk) 매뉴얼 페이지와 John Ousterhout의 책 Tcl and the Tk Toolkit (2nd edition)의 201쪽을 참조하십시오).
- func
는 하나의 인자를 취하는 파이썬 함수로, 이벤트가 발생할 때 호출됩니다. 이벤트 인스턴스가 인자로 전달됩니다. (이런 식으로 설치되는 함수를 흔히 콜백(callbacks)이라고 합니다.)
- add
는 선택적이고,
''나'+'입니다. 빈 문자열을 전달하면 이 바인딩이 이 이벤트와 연관된 다른 바인딩을 대체 함을 나타냅니다.'+'를 전달하면 이 함수가 이 이벤트 유형에 바인딩 된 함수 목록에 추가됩니다.
예를 들면:
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
이벤트의 widget 필드가 turn_red() 콜백에서 어떻게 액세스 되는지 주목하십시오. 이 필드는 X 이벤트를 포착한 위젯을 포함합니다. 다음 표에는 사용자가 액세스할 수 있는 다른 이벤트 필드와 Tk에서 이들을 표시하는 방법이 나열되어 있습니다. Tk 매뉴얼 페이지를 참조할 때 유용할 수 있습니다.
Tk |
Tkinter 이벤트 필드 |
Tk |
Tkinter 이벤트 필드 |
|---|---|---|---|
%f |
focus |
%A |
char |
%h |
height |
%E |
send_event |
%k |
keycode |
%K |
keysym |
%s |
state |
%N |
keysym_num |
%t |
time |
%T |
type |
%w |
width |
%W |
widget |
%x |
x |
%X |
x_root |
%y |
y |
%Y |
y_root |
index 매개 변수¶
많은 위젯에는 “index” 매개 변수가 전달되어야 합니다. 이들은 Text 위젯의 특정 위치, Entry 위젯의 특정 문자 또는 Menu 위젯의 특정 메뉴 항목을 가리키는 데 사용됩니다.
- Entry 위젯 인덱스 (인덱스, 뷰 인덱스 등)
Entry 위젯에는 표시되는 텍스트의 문자 위치를 참조하는 옵션이 있습니다. 다음
tkinter함수를 사용하여 텍스트 위젯에서 이러한 특수 지점에 접근할 수 있습니다:- Text 위젯 인덱스
Text 위젯의 인덱스 표기법은 매우 풍부하며 Tk 매뉴얼 페이지에 자세히 설명되어 있습니다.
- 메뉴 인덱스 (menu.invoke(), menu.entryconfig() 등)
메뉴에 대한 일부 옵션 및 메서드는 특정 메뉴 항목을 조작합니다. 옵션이나 매개 변수에 메뉴 인덱스가 필요한 때는 언제든지 다음과 같이 전달할 수 있습니다:
위에서부터 세고, 0에서 시작하는, 위젯에서 항목의 숫자 위치를 나타내는 정수.
현재 커서 아래에 있는 메뉴 위치를 나타내는, 문자열
"active".마지막 메뉴 항목을 나타내는, 문자열
"last".@6과 같이,@이 앞에 오는 정수로, 정수는 메뉴의 좌표계에서 y 픽셀 좌표로 해석됩니다.아무런 메뉴 항목을 가리키지 않는, 문자열
"none"은 menu.activate()와 함께 사용되어 모든 항목을 비활성화합니다, 마지막으로,메뉴 맨 위에서 아래로 스캔할 때, 메뉴 항목의 레이블과 패턴 일치하는 텍스트 문자열. 이 인덱스 유형은 다른 모든 항목 다음에 고려되므로,
last,active또는none레이블이 붙은 메뉴 항목과의 일치가 대신 위의 리터럴로 해석될 수 있음을 의미합니다.
이미지¶
서로 다른 형식의 이미지를 tkinter.Image의 해당 서브 클래스를 통해 만들 수 있습니다:
XBM 형식의 이미지를 위한
BitmapImage.PGM, PPM, GIF 및 PNG 형식의 이미지를 위한
PhotoImage. 후자는 Tk 8.6부터 지원됩니다.
두 가지 유형의 이미지는 file 또는 data 옵션을 통해 만들어집니다 (다른 옵션도 사용할 수 있습니다).
버전 3.13에서 변경: PhotoImage`에 이미지 하나에서 다른 이미지로 영역을 복사할 수 있는 :meth:!copy_replace` 메서드가 추가되었습니다. 이 과정에서 픽셀 확대 및/또는 서브샘플링을 적용할 수 있습니다. PhotoImage 메서드에 from_coords 매개변수를 copy(), zoom() 및 subsample`에 추가했습니다. 또한, :class:()!PhotoImage` 메서드 :meth:`!copy`에 zoom 및 subsample 매개변수를 추가했습니다.
그런 다음 image 옵션이 일부 위젯(예를 들어, 레이블, 버튼, 메뉴)에서 지원되는 곳이면 어디든 이미지 객체를 사용할 수 있습니다. 이 경우, Tk는 이미지에 대한 참조를 유지하지 않습니다. 이미지 객체에 대한 마지막 파이썬 참조가 삭제되면 이미지 데이터도 삭제되고, Tk는 이미지가 사용된 곳마다 빈 상자를 표시합니다.
더 보기
Pillow 패키지는 BMP, JPEG, TIFF 및 WebP와 같은 형식을 위한 지원을 추가합니다.
파일 처리기¶
Tk는 파일 기술자에서 I/O가 가능할 때 Tk 메인 루프에서 호출할 콜백 함수를 등록하고 등록 취소할 수 있도록 합니다. 파일 기술자당 하나의 처리기 만 등록 될 수 있습니다. 예제 코드:
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
윈도우에서는 이 기능을 사용할 수 없습니다.
얼마나 많은 바이트를 읽을 수 있는지 모르므로, BufferedIOBase나 TextIOBase read()나 readline() 메서드를 사용하고 싶지 않을것입니다, 이것들은 미리 정의 된 바이트 수를 읽으려고하기 때문입니다. 소켓의 경우, recv() 또는 recvfrom() 메서드가 제대로 작동합니다; 다른 파일의 경우, 날(raw) 읽기나 os.read(file.fileno(), maxbytecount)를 사용하십시오.
- Widget.tk.createfilehandler(file, mask, func)¶
파일 처리기 콜백 함수 func를 등록합니다. file 인자는
fileno()메서드가 있는 객체이거나(가령 파일이나 소켓 객체), 정수 파일 기술자일 수 있습니다. mask 인자는 아래의 세 가지 상수들을 OR로 조합한 것입니다. 콜백은 다음과 같이 호출됩니다:callback(file, mask)
- Widget.tk.deletefilehandler(file)¶
파일 처리기를 등록 취소합니다.