Я хочу отобразить фигуру matplotlib в приложении на python с графическим интерфейсом tkinter. Чтобы избежать блокирования функций пользовательского интерфейса во время создания фигуры и ее рисования в пользовательском интерфейсе, это необходимо сделать в другом потоке. Как нарисовать график в потоке, отличном от того, который содержит корень и фрейм tkinter?
Я попытался использовать модуль потоков, и мне удалось создать рисунок в другом потоке. Однако, когда я пытаюсь создать холст с рисунком, приложение вылетает и выдает «ПРЕДУПРЕЖДЕНИЕ: QApplication не был создан в потоке main ().» *
Импортирует
from tkinter import *
from tkinter import ttk
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from threading import Thread
Все втот же класс прямо сейчас. Я создаю корень, мэйнфрейм и кнопку в конструкторе
def __init__(self):
# Creates root and mainframe
self.root = Tk()
self.mainframe = ttk.Frame(self.root, padding="3 3 12 12")
self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
# Creates button that runs 'handle_input_change'-method on click
ttk.Button(self.mainframe, text="Show graph",
command=self.handle_input_change).grid(column=3, row=4, sticky=E)
Метод, который запускается при нажатии кнопки
def handle_input_change(self, *args):
# Starts another thread running the 'plot_current_data'-method
thread = Thread(target = self.plot_current_data)
thread.start()
def plot_current_data(self):
fig = # ... (irrelevant, could be any matplotlib figure)
# This is what makes the application crash and output the warning message
canvas = FigureCanvasTkAgg(fig, master=self.mainframe)
canvas.draw()
canvas.get_tk_widget().grid(column=1, row=5, rowspan=10, sticky=W)
Когда я запускаю все это в одном и том жепоток, код выше отображает цифру.