Я пытаюсь вставить граф matplotlib в tkinter GUI. Ниже приведен упрощенный код с кнопкой и графиком. Я ожидаю, что когда я нажму на кнопку, график начнет двигаться.
Успешно, если я позвоню напрямую .refresh()
. Однако, если я назову это в потоке (в .start()
). Окно GUI просто вылетает без сообщения об ошибке. Есть идеи, как это исправить?
import numpy as np
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import threading
class test:
def __init__(self):
root = tk.Tk()
root.geometry('300x300')
tk.Button(root, text = 'run', command = self.start).pack()
### code to draw the graph in root ###
self.fig = Figure(figsize = (6.2,4))
self.ax = self.fig.add_subplot(111)
self.x = np.linspace(0, 6*np.pi, 100)
self.y = np.sin(self.x)
self.line, = self.ax.plot(self.x,self.y)
canvas = FigureCanvasTkAgg(self.fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()
### code to draw the graph in root ###
root.mainloop()
def start(self):
t = threading.Thread(target=self.refresh)
t.start()
def refresh(self):
for phase in np.linspace(0, 10*np.pi, 500):
self.line.set_ydata(np.sin(self.x + phase))
self.fig.canvas.draw()
self.fig.canvas.flush_events()
test()