matplotlib으로 만든 애니메이션을 tkinter 프레임 안에 삽입하면 GUI 애플리케이션에서 동적인 데이터 시각화를 구현할 수 있습니다. 아래 단계를 따라 하면 tkinter 윈도우 내에서 matplotlib 애니메이션이 자연스럽게 실행되는 것을 확인할 수 있습니다.
구현 단계
그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
애플리케이션의 메인 윈도우 역할을 하는 Tk의 Toplevel 위젯을 생성합니다.
해당 위젯의 제목(title)을 설정합니다.
현재 그림에 좌표축(axes)을 추가하고 이를 현재 축으로 지정합니다.
새 그림을 생성하거나 기존 그림을 활성화합니다.
서브플롯 배치의 일부로 그림에 'ax'를 추가합니다.
linewidth=2 옵션으로 빈(dummy) 선 플롯을 생성합니다.
그림이 렌더링될 캔버스를 생성합니다.
실제로 작업을 수행할 FigureCanvas 객체를 만듭니다.
tkinter 창을 종료할 수 있는 keypress(키 입력) 이벤트를 등록합니다.
animate 함수를 반복적으로 호출하여 애니메이션을 생성합니다.
그림을 화면에 표시하려면 show() 메서드를 사용합니다.
예제 코드
import tkinter
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib import pyplot as plt, animation
import numpy as np
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
root = tkinter.Tk()
root.wm_title("Embedding in Tk")
plt.axes(xlim=(0, 2), ylim=(-2, 2))
fig = plt.Figure(dpi=100)
ax = fig.add_subplot(xlim=(0, 2), ylim=(-1, 1))
line, = ax.plot([], [], lw=2)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)
toolbar.update()
canvas.mpl_connect(
"key_press_event", lambda event: print(f"you pressed {event.key}"))
canvas.mpl_connect("key_press_event", key_press_handler)
button = tkinter.Button(master=root, text="Quit", command=root.quit)
button.pack(side=tkinter.BOTTOM)
toolbar.pack(side=tkinter.BOTTOM, fill=tkinter.X)
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
def init():
line.set_data([], [])
return line,
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y)
return line,
anim = animation.FuncAnimation(fig, animate, init_func=init,frames=200, interval=20, blit=True)
tkinter.mainloop()실행 결과
위 코드를 실행하면 tkinter 윈도우 안에서 사인파가 좌우로 흐르는 애니메이션이 다음과 같이 출력됩니다.

코드 핵심 포인트
FigureCanvasTkAgg는 matplotlib 그림을 tkinter 위젯으로 변환해 주는 핵심 클래스입니다. 또한 FuncAnimation은 animate 함수를 일정한 간격(interval)마다 반복 호출하며, blit=True 옵션을 사용하면 변경된 부분만 다시 그려서 애니메이션 성능을 크게 향상시킬 수 있습니다. NavigationToolbar2Tk를 추가하면 확대·축소, 저장 등의 도구 모음도 함께 사용할 수 있어 실용적인 GUI 시각화 애플리케이션을 완성할 수 있습니다.