Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การฝัง Matplotlib Animation ลงใน Tkinter Frame

ขั้นตอนการทำงาน

  • กำหนดขนาดรูปภาพและปรับระยะห่างรอบๆ subplots

  • สร้าง Widget Toplevel ของ Tk (หน้าต่างหลัก)

  • ตั้งชื่อหน้าต่าง

  • เพิ่ม Axes ลงใน Figure ปัจจุบัน

  • สร้าง Figure ใหม่หรือเปิดใช้งาน Figure ที่มีอยู่

  • เพิ่ม ax เข้าไปใน Figure

  • สร้างเส้นโค้งจำลอง (Dummy line) พร้อม linewidth=2

  • สร้าง Canvas สำหรับการเรนเดอร์ Figure

  • สร้าง Figure Canvas สำหรับการทำงาน

  • สร้าง Event keypress เพื่อออกจากโปรแกรม

  • สร้าง Animation โดยเรียกฟังก์ชัน animate ซ้ำๆ

  • เริ่มต้น Main Loop ของ Tkinter

ตัวอย่างโค้ด

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")

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 แสดง Animation ของคลื่นไซน์เคลื่อนที่ไปทางขวา พร้อม Toolbar นำทาง และปุ่ม Quit เพื่อปิดโปรแกรม

จุดสำคัญ: ใช้ FigureCanvasTkAgg สะพยายัน Matplotlib กับ Tkinter ใช้ FuncAnimation สร้างอนิเมชัน แบบ blit=True เพื่อประสิทธิภาพดีขึ้น