Как нарисовать фигуру matplotlib на холсте tkinter в другой теме - PullRequest
1 голос
/ 11 октября 2019

Я хочу отобразить фигуру 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)

Когда я запускаю все это в одном и том жепоток, код выше отображает цифру.

...