Python 如何以不同的线程在tkinter画布上绘制matplotlib图形

Python 如何以不同的线程在tkinter画布上绘制matplotlib图形,python,multithreading,matplotlib,tkinter,python-multithreading,Python,Multithreading,Matplotlib,Tkinter,Python Multithreading,我想在带有tkinter GUI的python应用程序中显示matplotlib图形。为了避免在创建图形并将其绘制到UI时阻塞UI功能,必须在另一个线程中执行此操作。如何在不同于包含tkinter根和框架的线程中绘制绘图 我尝试使用线程模块,并设法在另一个线程中创建一个图形。但是,当我尝试创建一个带有此图的画布时,应用程序崩溃并输出“警告:未在main()线程中创建QApplication” 进口 从tkinter导入* 从tkinter导入ttk 导入matplotlib 将matplotli

我想在带有tkinter GUI的python应用程序中显示matplotlib图形。为了避免在创建图形并将其绘制到UI时阻塞UI功能,必须在另一个线程中执行此操作。如何在不同于包含tkinter根和框架的线程中绘制绘图

我尝试使用线程模块,并设法在另一个线程中创建一个图形。但是,当我尝试创建一个带有此图的画布时,应用程序崩溃并输出“警告:未在main()线程中创建QApplication”

进口

从tkinter导入*
从tkinter导入ttk
导入matplotlib
将matplotlib.pyplot作为plt导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG
从线程导入线程
现在所有的东西都在同一个班级。 我在构造函数中创建根、大型机和一个按钮

def\uuuu初始化(自):
#创建根和大型机
self.root=Tk()
self.mainframe=ttk.Frame(self.root,padding=“3 3 12”)
self.mainframe.grid(列=0,行=0,粘性=(N,W,E,S))
#在单击时创建运行“handle\u input\u change”方法的按钮
ttk.按钮(self.mainframe,text=“显示图形”,
command=self.handle\u input\u change).grid(列=3,行=4,粘滞=E)
单击按钮时运行的方法

def handle_input_change(self,*args):
#启动运行“plot\u current\u data”方法的另一个线程
线程=线程(目标=self.plot\u当前数据)
thread.start()
def plot\u当前数据(自身):
图=#。。。(不相关,可以是任何matplotlib图形)
#这就是导致应用程序崩溃并输出警告消息的原因
canvas=FigureCanvasTkAgg(图,master=self.mainframe)
canvas.draw()
canvas.get_tk_widget().grid(列=1,行=5,行跨度=10,粘性=W)

当我在同一个线程中运行它时,上面的代码确实显示了这个图。

除了主线程,您不能将GUI放在任何其他线程中。这意味着您也不能在任何其他线程中绘制matplotlib绘图。所有与GUI相关的操作都必须在GUI线程中进行。因此,您需要以某种方式将fig移交给GUI线程。下面是一个用于线程间通信的队列示例:您不能将GUI放在主线程之外的任何其他线程中。这意味着您也不能在任何其他线程中绘制matplotlib绘图。所有与GUI相关的操作都必须在GUI线程中进行。因此,您需要以某种方式将fig移交给GUI线程。以下是用于线程间通信的队列示例: