Chapter 24. 파일 다루기

GUI 프로그램에서는 사용자가 직접 파일을 선택하거나 저장할 수 있는 기능이 필요합니다.
예를 들어,
- 메모장에서 문서를 열기
- 게시글 저장하기
- 이미지 선택하기
- 사진 업로드하기
이러한 기능은 모두 파일 다루기 기능을 이용합니다. Tkinter에서는 filedialog 모듈을 사용하여 파일 선택 창과 저장 창을 쉽게 만들 수 있습니다.
파일 관련 기능
| 기능 | 설명 |
|---|---|
| 파일 열기 | 기존 파일 선택 |
| 파일 저장 | 새로운 파일 저장 |
| 이미지 선택 | 이미지 파일 선택 |
filedialog 가져오기
from tkinter import filedialog
사용자가 원하는 파일을 선택하도록 하는 기능입니다.
파일 선택 창
from tkinter import * from tkinter import filedialog window = Tk() filename = filedialog.askopenfilename() print(filename) window.mainloop()
실행하면 파일 선택 창이 나타납니다.
TXT 파일만 선택
filename = filedialog.askopenfilename(
filetypes=[
("Text File","*.txt")
]
)
여러 형식 선택
filename = filedialog.askopenfilename(
filetypes=[
("Text File","*.txt"),
("Python","*.py"),
("All Files","*.*")
]
)
선택한 파일 출력
if filename:
print(filename)
예시
C:\Python\data\memo.txt
파일 읽기
if filename:
with open(
filename,
"r",
encoding="utf-8"
) as file:
print(file.read())
사용자가 원하는 이름으로 파일을 저장하는 기능입니다.
저장 창
filename = filedialog.asksaveasfilename()
TXT 저장
filename = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[
("Text File","*.txt")
]
)
파일 저장
if filename:
with open(
filename,
"w",
encoding="utf-8"
) as file:
file.write("안녕하세요.")
실행 후 hello.txt 파일이 생성됩니다.
Text 내용 저장
content = text.get(
"1.0",
END
)
if filename:
with open(
filename,
"w",
encoding="utf-8"
) as file:
file.write(content)
메모장 프로그램에서 가장 많이 사용하는 방식입니다.
이미지 파일을 선택하는 기능입니다. 회원 사진, 상품 이미지, 게시판 첨부파일 등에 많이 사용됩니다.
이미지 선택
filename = filedialog.askopenfilename(
filetypes=[
("Image","*.png *.jpg *.jpeg *.gif")
]
)
print(filename)
선택한 이미지 출력
from tkinter import * # tkinter 모듈 가져오기 window = Tk() # 새로운 윈도우 생성 photo = PhotoImage( # 이미지 객체 생성 file="image.png" # 이미지 파일 경로 ) label = Label( # 레이블 위젯 생성 window, # 부모 위젯은 window image=photo # 표시할 이미지 설정 ) label.pack() # 레이블을 윈도우에 추가 window.mainloop() # 이벤트 루프 시작
PhotoImage는 PNG, GIF 형식을 기본 지원합니다.
JPG 이미지
JPG 이미지는 Pillow(PIL) 라이브러리를 사용합니다.
설치
pip install pillow
Pillow 사용
from PIL import Image from PIL import ImageTk image = Image.open(filename) photo = ImageTk.PhotoImage(image)
Label에 표시
label.config(image=photo) label.image = photo
이미지 미리보기
def openImage(): # 이미지 열기 함수 정의 filename = filedialog.askopenfilename( # 파일 선택 대화상자 열기 filetypes=[ # 파일 형식 지정 ("Image","*.jpg *.png *.jpeg") # 이미지 파일 형식 ] ) if filename: # 파일이 선택되었는지 확인 image = Image.open(filename) # 선택한 파일로 이미지 열기 photo = ImageTk.PhotoImage(image) # 이미지 객체를 PhotoImage로 변환 label.config(image=photo) # 레이블에 이미지 설정 label.image = photo # 레이블에 이미지 저장
Button( # 버튼 위젯 생성 window, # 부모 윈도우 지정 text="이미지 선택", # 버튼 텍스트 설정 command=openImage # 클릭 시 openImage 함수 호출 ).pack() # 버튼 배치
이름, 사진, 사진미리보기

from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
window = Tk()
window.title("이름 / 사진 미리보기")
window.geometry("420x520")
photo_image = None
def choose_photo():
global photo_image
path = filedialog.askopenfilename(
title="사진 선택",
filetypes=[
("이미지 파일", "*.png *.jpg *.jpeg *.gif *.bmp"),
("모든 파일", "*.*"),
],
)
if not path:
return
img = Image.open(path)
img.thumbnail((280, 280))
photo_image = ImageTk.PhotoImage(img)
preview.config(image=photo_image, text="")
photo_path.set(path)
Label(window, text="이름:", font=("맑은 고딕", 11)).pack(anchor="w", padx=24, pady=(16, 4))
entry_name = Entry(window, width=36, font=("맑은 고딕", 11))
entry_name.pack(padx=24)
Label(window, text="사진:", font=("맑은 고딕", 11)).pack(anchor="w", padx=24, pady=(12, 4))
Button(window, text="사진 선택", width=12, command=choose_photo).pack(anchor="w", padx=24)
photo_path = StringVar()
Label(window, textvariable=photo_path, font=("맑은 고딕", 9), fg="gray").pack(
anchor="w", padx=24, pady=4
)
Label(window, text="사진 미리보기", font=("맑은 고딕", 11)).pack(anchor="w", padx=24, pady=(8, 4))
preview_frame = Frame(window, width=300, height=300, bg="white", relief="solid", bd=1)
preview_frame.pack(padx=24, pady=(0, 16))
preview_frame.pack_propagate(False)
preview = Label(preview_frame, text="사진을 선택하세요", bg="white", font=("맑은 고딕", 10))
preview.pack(expand=True)
window.mainloop()
- GUI 프로그램에서 파일 다루기 기능은 필수적이다.
- Tkinter의 filedialog 모듈을 사용하여 파일 선택 및 저장 기능을 구현할 수 있다.
- 파일 열기 및 저장 기능을 통해 사용자가 파일을 쉽게 다룰 수 있다.
- Pillow 라이브러리를 사용하여 JPG 이미지 파일을 다룰 수 있다.
- 복합 예제를 통해 파일 다루기 기능을 실제로 구현해 볼 수 있다.