Вставить Matplotlib в Tkinter и запустить в Multithread - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь вставить граф 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...