2025. 2. 28. 14:37ㆍ프로그래밍 언어/Python
7. Tkinter 심화 주제: 외부 라이브러리 활용, 네트워크 프로그래밍, 크로스 플랫폼 배포
이번 심화 과정에서는 Tkinter와 외부 라이브러리(Matplotlib, PIL) 통합, 네트워크 프로그래밍 적용, PyInstaller를 활용한 크로스 플랫폼 배포를 학습합니다.
이를 통해 Tkinter의 확장성을 높이고, 실전 프로젝트에서 활용할 수 있도록 합니다.
또한, 네트워크 프로그래밍 및 배포 과정에서 발생할 수 있는 오류 처리 및 운영체제별 차이점을 보완하여 보다 견고한 애플리케이션을 만들 수 있도록 구성하였습니다.
1. Tkinter와 외부 라이브러리 통합
Tkinter는 기본적으로 GUI 애플리케이션 제작을 위한 라이브러리이지만,
추가적인 기능이 필요할 때 외부 라이브러리(Matplotlib, PIL 등) 를 활용하여 확장할 수 있습니다.
1) Tkinter + Matplotlib: 그래프 출력
Matplotlib은 데이터 시각화를 위한 라이브러리로, Tkinter와 함께 사용하여 GUI 내에서 그래프를 표시할 수 있습니다.
✅ Matplotlib을 활용한 그래프 출력
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
def plot_graph():
""" 간단한 그래프를 Tkinter 창에 표시 """
fig = Figure(figsize=(5, 4), dpi=100)
ax = fig.add_subplot(111)
ax.plot([1, 2, 3, 4, 5], [5, 7, 6, 8, 7], marker='o', linestyle='-')
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()
root = tk.Tk()
root.title("Tkinter + Matplotlib 그래프")
btn = tk.Button(root, text="그래프 그리기", command=plot_graph)
btn.pack()
root.mainloop()
✅ 버튼을 클릭하면 Tkinter 창에 그래프가 표시됩니다.
2) Tkinter + PIL: 이미지 처리
PIL(Pillow)은 이미지 편집과 변환을 지원하는 라이브러리로, Tkinter에서 이미지를 표시할 때 사용됩니다.
✅ 이미지 불러오기 및 표시
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
def open_image():
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
if file_path:
img = Image.open(file_path)
img = img.resize((300, 300)) # 크기 조정
tk_img = ImageTk.PhotoImage(img)
label.config(image=tk_img)
label.image = tk_img # 참조 유지
root = tk.Tk()
root.title("Tkinter + PIL 이미지 뷰어")
btn = tk.Button(root, text="이미지 열기", command=open_image)
btn.pack()
label = tk.Label(root)
label.pack()
root.mainloop()
✅ 파일을 선택하면 Tkinter 창에 이미지가 표시됩니다.
2. 네트워크 프로그래밍과 Tkinter 결합
Tkinter 애플리케이션에서 웹 API를 호출하거나 소켓 통신을 수행하여 데이터를 주고받을 수 있습니다.
🚨 오류 처리 및 제한 사항 보완
- 무료 API에는 사용량 제한이 있을 수 있습니다.
- 네트워크 통신 중 타임아웃, 서버 응답 오류 등의 예외 처리가 필요합니다.
1) Tkinter + Requests: 웹 API 데이터 가져오기
requests 라이브러리를 사용하면 웹 API에서 데이터를 불러와 Tkinter에 표시할 수 있습니다.
✅ 실시간 환율 데이터 가져오기 (오류 처리 추가)
import tkinter as tk
import requests
def get_exchange_rate():
""" API에서 환율 데이터 가져오기 (오류 처리 포함) """
try:
response = requests.get("https://api.exchangerate-api.com/v4/latest/USD", timeout=5)
response.raise_for_status() # HTTP 오류 발생 시 예외 처리
data = response.json()
rate = data["rates"]["KRW"] # 1달러당 원화 환율
label.config(text=f"1 USD = {rate:.2f} KRW")
except requests.exceptions.RequestException as e:
label.config(text=f"오류 발생: {e}")
root = tk.Tk()
root.title("Tkinter + API 요청")
btn = tk.Button(root, text="환율 가져오기", command=get_exchange_rate)
btn.pack()
label = tk.Label(root, text="환율 정보 없음")
label.pack()
root.mainloop()
✅ 오류 처리 추가: API 호출 중 연결 오류가 발생해도 프로그램이 멈추지 않습니다.
2) Tkinter + 소켓 프로그래밍: 채팅 애플리케이션
소켓(Socket)을 활용하면 네트워크를 통해 메시지를 주고받는 기능을 구현할 수 있습니다.
🚨 주의: 서버가 필요하며, 네트워크 오류 처리가 포함되지 않으면 프로그램이 강제 종료될 수 있습니다.
✅ TCP 채팅 클라이언트 (오류 처리 및 안전한 종료 추가)
import tkinter as tk
import socket
import threading
client_socket = None # 1️⃣ 변수를 미리 선언하여 오류 방지
def receive_messages():
""" 서버로부터 메시지를 받아 Tkinter 창에 표시 """
while True:
try:
msg = client_socket.recv(1024).decode("utf-8")
if not msg:
break
chat_list.insert(tk.END, msg)
except Exception as e:
print("연결 오류:", e)
break
def send_message():
""" 입력한 메시지를 서버로 전송 """
msg = entry.get()
if msg and client_socket:
try:
client_socket.send(msg.encode("utf-8"))
entry.delete(0, tk.END)
except Exception as e:
print("전송 오류:", e)
root = tk.Tk()
root.title("Tkinter 채팅 클라이언트")
chat_list = tk.Listbox(root, height=15, width=50)
chat_list.pack()
entry = tk.Entry(root, width=40)
entry.pack(side=tk.LEFT)
send_btn = tk.Button(root, text="전송", command=send_message)
send_btn.pack(side=tk.RIGHT)
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 12345))
threading.Thread(target=receive_messages, daemon=True).start()
except Exception as e:
chat_list.insert(tk.END, f"서버 연결 실패: {e}")
client_socket = None
def on_closing():
""" 창 닫기 시 안전하게 소켓 종료 """
global client_socket
if client_socket:
client_socket.close()
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
✅ 서버 연결 오류 및 안전한 종료 처리가 추가되었습니다.
3. PyInstaller를 활용한 크로스 플랫폼 배포
Tkinter 애플리케이션을 Python 코드가 아닌 독립 실행 파일(.exe, .app, .dmg)로 변환하여 배포할 수 있습니다.
🚨 운영체제별 차이점
- Windows: .exe 실행 파일 생성
- macOS: .app 번들 생성 (추가 설정 필요)
- Linux: .bin 또는 .sh 스크립트로 실행
1) PyInstaller 설치
pip install pyinstaller
2) Tkinter 애플리케이션 실행 파일 생성
pyinstaller --onefile --windowed my_tkinter_app.py
✅ 위 명령어를 실행하면 dist/ 폴더에 실행 파일이 생성됩니다.
📌 최종 정리
- Tkinter + Matplotlib, PIL → 그래프 출력 및 이미지 처리
- Tkinter + Requests, Socket → API 요청 및 네트워크 기반 채팅
- PyInstaller → 크로스 플랫폼 배포
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python Tkinter - 9. 준비 자료 및 환경 (0) | 2025.02.28 |
---|---|
Python Tkinter - 8. Tkinter 추천 프로젝트 (0) | 2025.02.28 |
Python Tkinter - 6. 실전 프로젝트와 최적화 (0) | 2025.02.28 |
Python Tkinter - 5. 그래픽과 애니메이션 (0) | 2025.02.28 |
Python Tkinter - 4. 메뉴, 다이얼로그, 스타일링 (0) | 2025.02.03 |