Files
python-examples/doc/40_tkinter.md
2025-01-23 11:02:27 +09:00

187 lines
8.1 KiB
Markdown

# Tkinter 모듈: 간단한 GUI 프로그램 만들기
Tkinter는 파이썬에서 GUI(Graphical User Interface, 그래픽 사용자 인터페이스) 프로그램을 만들기 위한 표준 라이브러리입니다. 즉, 파이썬 코드를 사용하여 창, 버튼, 라벨 등 다양한 UI 요소를 만들고 사용자와 상호 작용하는 프로그램을 개발할 수 있도록 도와줍니다.
```python
import tkinter as tk
# 메인 창 생성
window = tk.Tk()
window.title("첫 번째 Tkinter 프로그램")
# 라벨 생성
label = tk.Label(window, text="Hello, Tkinter!")
label.pack()
# 버튼 생성
button = tk.Button(window, text="클릭", command=lambda: print("버튼 클릭"))
button.pack()
# 창 실행
window.mainloop()
```
위 코드는 간단한 창을 만들고, 그 안에 "Hello, Tkinter!" 라는 라벨과 "클릭" 버튼을 배치하는 예시입니다. 버튼을 클릭하면 콘솔에 "버튼 클릭"이 출력됩니다.
## 위젯
Tkinter는 다양한 종류의 위젯을 제공하여 풍부한 사용자 인터페이스를 구축할 수 있도록 지원합니다. 각 위젯은 특정한 기능을 수행하며, 이들을 조합하여 복잡한 GUI 애플리케이션을 만들 수 있습니다.
### 컨테이너 위젯
* Frame: 다른 위젯들을 그룹화하여 관리하는 컨테이너입니다. 레이아웃 관리자를 사용하여 프레임 내부에 위젯을 배치합니다.
* LabelFrame: 프레임과 유사하지만, 라벨을 포함하여 그룹을 구분합니다.
* PanedWindow: 두 개 이상의 창을 가로 또는 세로로 나누어 관리하는 컨테이너입니다.
### 기본 위젯
* Label: 텍스트를 표시하는 위젯입니다.
* Button: 버튼을 생성하여 사용자의 클릭 이벤트를 처리합니다.
* Entry: 한 줄의 텍스트를 입력받는 위젯입니다.
* Text: 여러 줄의 텍스트를 입력하고 편집할 수 있는 위젯입니다.
* Checkbutton: 체크박스를 생성하여 선택 여부를 확인합니다.
* Radiobutton: 라디오 버튼을 생성하여 여러 옵션 중 하나를 선택하도록 합니다.
* Listbox: 여러 항목을 리스트 형태로 보여주고, 사용자가 항목을 선택할 수 있도록 합니다.
* Scrollbar: 스크롤바를 생성하여 내용이 많은 위젯을 스크롤하여 볼 수 있도록 합니다.
* Message: 텍스트를 여러 줄로 표시하며, 자동 줄 바꿈 기능을 제공합니다.
### 메뉴 위젯
* Menu: 메뉴바를 생성합니다.
* Menubutton: 메뉴 버튼을 생성합니다.
* MenuButton: 메뉴 버튼을 생성합니다. (Menubutton과 동일)
### 다이얼로그 위젯
* Messagebox: 간단한 메시지 박스를 생성합니다.
* filedialog: 파일 선택 대화상자를 생성합니다.
* colorchooser: 색상 선택 대화상자를 생성합니다.
### 기타 위젯
* Canvas: 그림을 그리거나 사용자 정의 위젯을 만들 때 사용합니다.
* Scale: 슬라이더를 생성하여 값을 조절할 수 있도록 합니다.
* Spinbox: 숫자를 입력하는 스핀 박스를 생성합니다.
* OptionMenu: 드롭다운 메뉴를 생성합니다.
### 위젯의 속성과 메서드
각 위젯은 다양한 속성과 메서드를 가지고 있어 외형과 기능을 커스터마이징할 수 있습니다. 예를 들어, font, fg, bg 속성을 사용하여 폰트, 전경색, 배경색을 설정할 수 있습니다.
## 레이아웃 관리자
Tkinter에서 다양한 위젯을 생성하고 창에 배치하려면 레이아웃 관리자가 필요합니다. 레이아웃 관리자는 위젯들의 위치와 크기를 자동으로 조절하여 보기 좋은 화면을 구성하는 역할을 합니다. Tkinter는 주로 다음과 같은 세 가지 레이아웃 관리자를 제공합니다.
### pack() 레이아웃 관리자
위젯을 순서대로 창에 채워 넣습니다. 마치 박스를 쌓아 올리듯이 위젯을 배치합니다.
* 장점: 간단하고 사용하기 쉽습니다.
* 단점: 복잡한 레이아웃을 구현하기 어려울 수 있습니다.
```python
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="첫 번째 라벨")
label1.pack()
label2 = tk.Label(root, text="두 번째 라벨")
label2.pack(side="bottom") # 아래쪽에 배치
root.mainloop()
```
### grid() 레이아웃 관리자
위젯을 행과 열 형태의 격자에 배치합니다. 엑셀 시트처럼 생각하면 쉽습니다.
* 장점: 복잡한 레이아웃을 정교하게 구성할 수 있습니다.
* 단점: 초기 설정이 다소 복잡할 수 있습니다.
```python
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="첫 번째 라벨")
label1.grid(row=0, column=0)
label2 = tk.Label(root, text="두 번째 라벨")
label2.grid(row=1, column=0)
root.mainloop()
```
### place() 레이아웃 관리자
위젯을 정확한 위치에 배치합니다. 좌표를 직접 지정하여 절대적인 위치를 설정합니다.
* 장점: 매우 정확한 배치가 가능합니다.
* 단점: 창 크기가 변경될 때 위젯의 위치가 고정되어 불편할 수 있습니다.
```python
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="첫 번째 라벨")
label1.place(x=50, y=50)
root.mainloop()
```
## 이벤트 처리
Tkinter는 사용자의 입력이나 창의 크기 변경 등 다양한 이벤트를 감지하고, 이에 대한 적절한 동작을 수행할 수 있도록 이벤트 처리 기능을 제공합니다. 이를 통해 사용자와 상호 작용하는 동적인 GUI 프로그램을 만들 수 있습니다.
### 이벤트 종류
* 마우스 이벤트: 클릭, 더블 클릭, 드래그 등
* 키보드 이벤트: 키 입력, 키 누르고 있기 등
* 위젯 이벤트: 위젯의 크기 변경, 포커스 변경 등
### 이벤트 처리 방법
#### command 옵션을 이용한 이벤트 처리
가장 간단한 방법으로, 버튼 클릭과 같이 특정 이벤트에 대한 처리 함수를 직접 지정할 수 있습니다.
```python
import tkinter as tk
def button_click():
print("버튼이 클릭되었습니다.")
window = tk.Tk()
button = tk.Button(window, text="클릭", command=button_click)
button.pack()
window.mainloop()
```
위 코드에서 command 옵션에 button_click 함수를 지정하여 버튼이 클릭될 때 해당 함수가 실행되도록 합니다.
#### bind 메서드를 이용한 이벤트 처리
더욱 다양한 이벤트를 처리하고, 이벤트 발생 시에 추가적인 정보를 얻고 싶을 때 bind 메서드를 사용합니다.
```python
import tkinter as tk
def on_click(event):
print("클릭한 위치:", event.x, event.y)
window = tk.Tk()
label = tk.Label(window, text="여기에 클릭하세요")
label.bind("<Button-1>", on_click)
label.pack()
window.mainloop()
```
위 코드에서 <Button-1>은 마우스 왼쪽 버튼 클릭 이벤트를 의미하며, on_click 함수가 호출될 때 이벤트 정보를 담은 event 객체가 전달됩니다. event.x와 event.y를 통해 클릭한 위치의 좌표를 얻을 수 있습니다.
### 이벤트 객체
이벤트 객체는 이벤트 발생 시에 전달되는 객체로, 이벤트에 대한 다양한 정보를 포함하고 있습니다. 예를 들어, 이벤트 발생 위치, 키 코드, 마우스 버튼 등을 확인할 수 있습니다.
### 주요 이벤트 종류
* `<Button-1>`: 마우스 왼쪽 버튼 클릭
* `<Button-2>`: 마우스 가운데 버튼 클릭
* `<Button-3>`: 마우스 오른쪽 버튼 클릭
* `<Key>`: 키 입력
* `<Motion>`: 마우스 이동
* `<Configure>`: 위젯 크기 변경
### 이벤트 처리 시 주의할 점
* 이벤트 순서: 여러 이벤트가 동시에 발생할 경우 처리 순서가 달라질 수 있습니다.
* 이벤트 전파: 이벤트는 부모 위젯으로 전파될 수 있습니다.
* 람다 함수: bind 메서드에 직접 함수를 전달할 때 람다 함수를 사용하면 유용합니다.
## Tkinter의 장단점
### 장점
* 간단하고 배우기 쉽습니다.
* 파이썬 표준 라이브러리로 별도 설치가 필요 없습니다.
* 다양한 플랫폼에서 동작합니다.
### 단점
* 복잡한 GUI를 만들기에는 부족한 기능이 있을 수 있습니다.
* 디자인 자유도가 낮을 수 있습니다.