개요
Tkinter는 GUI 기반 애플리케이션을 손쉽게 만들 수 있도록 Python에서 기본 제공하는 표준 라이브러리입니다. Tkinter 자체는 PNG·JPG 같은 이미지 형식을 직접 지원하지 않기 때문에, 이미지를 다룰 때는 PIL(Pillow) 라이브러리를 함께 사용하는 것이 일반적입니다.
이번 글에서는 화면의 특정 영역을 캡처한 스크린샷을 디스크에 저장하지 않고, 메모리에서 곧바로 새 창(Toplevel)에 표시하는 방법을 알아보겠습니다. 이를 구현하려면 아래 단계를 따르면 됩니다.
필요한 라이브러리(
tkinter,pyautogui,PIL)를 가져옵니다.스크린샷을 촬영하는 버튼을 생성합니다.
스크린샷을 촬영하는 함수를 정의합니다.
함수 내부에서 캡처할 시작 좌표(coords)와 영역 크기(region)를 지정합니다.
Toplevel윈도우를 생성하고, 그 안에 이미지를 담은Label위젯을 배치합니다.위젯을 화면에 배치하고 캡처된 이미지를 출력합니다.
사전 준비
예제를 실행하기 전에 아래 명령으로 필요한 패키지를 설치해 주세요.
pip install pillow pyautogui
예제 코드
# Import the required libraries
from tkinter import *
import pyautogui
from PIL import ImageTk, Image
# Create an instance of tknter frame or window
win = Tk()
# Set the size of the window
win.geometry("700x350")
# Define a function to take the screenshot
def take_screenshot():
x = 500
y = 500
# Take the screenshot in the given corrds
im1 = pyautogui.screenshot(region=(x, y, 700, 300))
# Create a toplevel window
top = Toplevel(win)
im1 = ImageTk.PhotoImage(im1)
# Add the image in the label widget
image1 = Label(top, image=im1)
image1.image = im1
image1.place(x=0, y=0)
Button(win, text='Take ScreenShot', command=take_screenshot).pack(padx=10, pady=10)
win.mainloop()코드 핵심 포인트
pyautogui.screenshot(region=(x, y, width, height))는 지정한 좌표에서 시작해 해당 크기만큼 화면을 캡처하며, 결과를 PIL 이미지 객체로 반환합니다.ImageTk.PhotoImage()를 사용하면 PIL 이미지를 Tkinter에서 표시할 수 있는 형태로 변환할 수 있습니다. 이 과정에서 파일로 저장할 필요가 전혀 없습니다.image1.image = im1구문은 반드시 유지해야 합니다. 이 참조가 없으면 가비지 컬렉터가 이미지 객체를 회수하여 위젯에 빈 이미지만 표시되는 문제가 발생합니다.
실행 결과
코드를 실행하면 "Take ScreenShot" 버튼이 있는 창이 나타납니다.

버튼을 클릭하면 좌표 (x=500, y=500)에서 시작하여 너비 700px, 높이 300px 크기의 화면 영역이 캡처되고, 저장 과정 없이 곧바로 새 창에 표시됩니다.

마무리
이처럼 pyautogui와 Pillow를 조합하면 스크린샷을 파일 시스템에 기록하지 않고도 Tkinter 창에 실시간으로 표시할 수 있습니다. 화면 녹화 미리보기, 캡처 도구, 모니터링 대시보드 등 다양한 GUI 애플리케이션으로 확장해 활용해 보세요.