Помещение двух обновляемых фигур matplotlib в реальном времени на сетку tkinter с использованием canvas - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь отобразить две обновляемые фигуры matplotlib в реальном времени на сетке tkinter, используя canvas '.

В настоящее время я пробовал код ниже, используя python 3.7 на spyder.

a = Figure(figsize=(10, 3))
plot_a = a.add_subplot(111)
plot_a.set_xlim([0, 2*np.pi])
plot_a.set_ylim([-1, 1])

lna, = plot_a.plot([], [], color='red', lw=5)

b = Figure(figsize=(10, 3))
plot_b = b.add_subplot(111)
plot_b.set_xlim([0, 2*np.pi])
plot_b.set_ylim([-1, 1])

lnb, = plot_b.plot([], [], color='olive', lw=5)

x = np.linspace(0, 2*np.pi, 1024)

def updateGraphsA(i):
    lna.set_xdata(x)
    lna.set_ydata(np.sin(x + i * np.pi / 10))
    print('in A')


def updateGraphsB(i):
    lnb.set_xdata(x)
    lnb.set_ydata(np.sin(x - i * np.pi / 10))
    print('in B')


class GUI(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "Placeholder")

        canvasA = FigureCanvasTkAgg(a, self)
        canvasA.draw()
        canvasA.get_tk_widget().grid(
            row=0, column=0, pady=2, padx=10, sticky='nsew')

        canvasB = FigureCanvasTkAgg(b, self)
        canvasB.draw()
        canvasB.get_tk_widget().grid(
            row=1, column=0, pady=2, padx=10, sticky='nsew')


app = GUI()
aniA = animation.FuncAnimation(a, updateGraphsA, interval=1000, blit=False)
aniB = animation.FuncAnimation(b, updateGraphsB, interval=1000, blit=False)
app.mainloop()

Я ожидаю, что это будет чередоваться между печатью "в a" и "в b" при обновлении обеих цифр в графическом интерфейсе. Тем не менее, он печатает только «в b» и только обновляет холст / график B

Если я закомментирую следующий код в классе для canvas B,

canvasB = FigureCanvasTkAgg(b, self)
canvasB.draw()
canvasB.get_tk_widget().grid(
    row=1, column=0, pady=2, padx=10, sticky='nsew')

он распечатает "в" и обновит холст / график А, как и ожидалось. Как я могу это исправить, чтобы он обновлялся одновременно.

...