Python 使用matplotlib.pyplot时,tkinter GUI不会以“X”终止

Python 使用matplotlib.pyplot时,tkinter GUI不会以“X”终止,python,matplotlib,tkinter,Python,Matplotlib,Tkinter,我正在运行一个简单的tkinter应用程序,它用一个动画图形绘制一些数据。当使用matplotlib.figure.figure和add_子窗口时,当我使用上部菜单“X”按钮关闭窗口时,默认情况下,程序会很好地终止。工作代码: self.f = matplotlib.figure.Figure(figsize=(6, 4), dpi=100) self.ax = self.f.add_subplot(111) 现在,当我尝试将matplotlib.pyplot.figure与matplotli

我正在运行一个简单的tkinter应用程序,它用一个动画图形绘制一些数据。当使用matplotlib.figure.figure和add_子窗口时,当我使用上部菜单“X”按钮关闭窗口时,默认情况下,程序会很好地终止。工作代码:

self.f = matplotlib.figure.Figure(figsize=(6, 4), dpi=100)
self.ax = self.f.add_subplot(111)
现在,当我尝试将matplotlib.pyplot.figure与matplotlib.pyplot.subplot2grid一起使用时,“X”确实会关闭窗口,但程序仍在运行

self.f = plt.figure(figsize=(6, 4), dpi=100)
self.ax = plt.subplot2grid((6,4), (0,0), rowspan=6, colspan=4)
我已尝试在程序末尾添加matplotlib.pyplot.closeall,但应用程序根本没有退出主循环:

有什么可能的原因和替代方案吗

PS:使用self.protocolWM_DELETE_窗口,self.destroy在self是tk.tk实例的情况下不起作用。

您可以尝试处理WM_DELETE_窗口事件并关闭所有绘图,如下所示:

import matplotlib.pyplot as plt

def on_closing():
   plt.close("all")
   app.destroy()

app = myApp()
.
.
.
app.protocol("WM_DELETE_WINDOW", on_closing)
app.mainloop()

在像tkinter这样的GUI应用程序中使用pyplot可能会导致问题,因为GUI mainloop和pyplot状态机都试图管理相同的对象。我建议在GUIs中嵌入matplotlib时不要使用pyplot;这样就可以从一开始就避免此类问题。@ImportanceOfBeingErnest这样的事情即使使用线程/进程也无法正常处理?另外,您是否知道其他Python GUI框架(如wxPython和PyQt/Pyside)是否会出现此类问题?当pyplot与启动eventloop的任何其他框架组合时,可能会出现此类问题。您可以单独处理pyplot,即如果GUI本身不显示任何绘图,但正如所说的,最简单的方法是完全删除代码中的pyplot。根本不应该有任何理由使用pyplot。如果您不想创建自己的GUI,那么这只是一件方便的事情——不管怎么说,您在这里就是这么做的
import matplotlib.pyplot as plt

def on_closing():
   plt.close("all")
   app.destroy()

app = myApp()
.
.
.
app.protocol("WM_DELETE_WINDOW", on_closing)
app.mainloop()