Встраивание анимированного Matplotlib в Tkinter приводит к тому, что программа никогда не заканчивается - PullRequest
0 голосов
/ 03 января 2019

Я искал и не смог выяснить, как завершить эту программу при закрытии окна.Это прекрасно работает для статического pyplot, но когда я запускаю анимированный сюжет, когда я закрываю окно, мне нужно выйти из программы с помощью fn-ctrl-b.

#---------Imports
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import time
import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
#---------End of imports

# Create figure for plotting
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
xs = []
ys = []
zs = []

def animate(i, xs, ys, zs):
    xs.append(time.clock())
    ys.append(time.clock()+np.random.random())

    xs = xs[-100:]
    ys = ys[-100:]

    ax.clear()
    ax.plot(xs, ys)

root = tk.Tk()

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(column=0,row=0)

ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys, zs), interval=5)

tk.mainloop()

Я заранее благодарен за любую помощь!

1 Ответ

0 голосов
/ 03 января 2019

Мой ответ будет в ООП.Я предпочитаю использовать классовый подход.

Поскольку ImportanceOfBeingErnest указывает, что пиплот, скорее всего, является виновником, поэтому мы должны использовать figure из matplotlib.

После использования импорта фигур из matplotlib вместо pyplotя обнаружил, что любая проблема, которую я заметил, теперь исчезла.Это должно исправить вашу проблему.

import tkinter as tk
import numpy as np
import time
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import animation, figure


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        fig = figure.Figure()
        canvas = FigureCanvasTkAgg(fig, master=self)
        canvas.get_tk_widget().grid(column=0, row=0)
        self.ax = fig.add_subplot(1, 1, 1)
        self.xs = []
        self.ys = []
        self.zs = []

        self.ani = animation.FuncAnimation(fig, self.animate, interval=5)

    def animate(self, event):
        self.xs.append(time.clock())
        self.ys.append(time.clock() + np.random.random())
        self.xs = self.xs[-100:]
        self.ys = self.ys[-100:]
        self.ax.clear()
        self.ax.plot(self.xs, self.ys)


if __name__ == "__main__":
    App().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...