我正在尝试使用Tkinter制作一个简单的GUI,该GUI使用Matplotlib生成大量图并将其保存到硬盘中。
已附加是执行此操作的简单代码,但是,在保存所有绘图后,Tkinter GUI关闭并且脚本停止。我认为这个问题可能与plt.close()有关,因为当我删除 plt.close()时,GUI窗口不再关闭,但这并不奇怪,内存很快就被填满了直到整个崩溃。
我尝试使用 plt.clf(), plt.gcf()。clear(), fig.clear代替plt.close() (),但没有一个起作用。它们使GUI窗口保持不变,但是会导致内存问题。
有人知道为什么plt.close()关闭Tkinter GUI窗口,以及如何防止它发生吗?完成后,我需要GUI停留并确定要从内存中删除的对象和他们在一起。
我正在使用Python3.6.3rc1,Windows 7,Tkinter 8.6和Matplotlib 3.0.2。
from tkinter import *
import matplotlib.pyplot as plt
import os
def make_plot():
x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
for j in range(0,20):
fig = plt.figure(num=None, figsize=(20, 10), dpi=200, facecolor='w', edgecolor='w')
plt.plot(x,y)
plt.xlabel("x")
plt.ylabel("y")
out_name = os.getcwd()+ "\\" + str(j)+".png"
print(out_name)
plt.savefig(out_name)
plt.close()
class Application(Frame):
def run_make_plot(self):
make_plot()
def createWidgets(self):
self.button = Button(self)
self.button["text"] = "Plot"
self.button["command"] = self.run_make_plot
self.button.pack()
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
答案 0 :(得分:0)
这取决于后端。当然,在使用tkinter时,您想使用tkagg后端,但这就是问题的原因。但是,在这种情况下,您不需要任何交互式后端,因此添加
import matplotlib
matplotlib.use("Agg")
在顶部(在导入pyplot之前)将解决该问题。另外,您可以删除root.destroy()
,因为这似乎没有必要,否则可能会导致错误。