我正在尝试创建一个在画布对象中嵌入matplotlib图形的Tkinter窗口小部件类。我写的代码几乎可以工作,但是当窗口小部件关闭时似乎没有正确退出。这是我正在使用的代码。这不是我正在使用的实际matplotlib图形代码,而是我为了提出这个问题而编写的内容。我原来的matplotlib图形代码非常长,并且不太适合尝试复制这篇文章。
from Tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
def schart2(stock_sym):
x = [1,2,3,4]
y = [20,21,20.5, 20.8]
plt.plot(x,y)
plt.show()
class StockChart(Frame):
def __init__(self, stock_sym=''):
Frame.__init__(self, parent=None)
self.pack(expand=YES, fill=BOTH)
self.makeWidgets(stock_sym)
def makeWidgets(self, stock_sym):
#self.f = graphData(stock_sym,12,26)
self.f = schart2(stock_sym)
self.canvas = FigureCanvasTkAgg(self.f)
self.canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
self.canvas.show()
if __name__ == '__main__':
StockChart('ACAD').mainloop()
当我运行此代码时,窗口小部件被正确绘制并按预期运行,但是当我单击关闭图标按钮时,窗口小部件从屏幕上消失但代码继续运行并且空闲提示永远不再出现,而是空闲提示只是有一个闪烁的光标但没有提示。通常当我创建这样的小部件时,当我单击关闭图标按钮时,小部件关闭,底层代码也退出,返回到正常的空闲提示。如果有人对如何正确退出此代码有任何想法,我将不胜感激。我假设问题以某种方式与matplotlib嵌入的代码部分有关。真诚的,乔治
答案 0 :(得分:1)
您根本不使用此代码访问Tkinter,因为您的函数schart2返回None
,然后将其分配给self.f
并用于self.canvas = FigureCanvasTkAgg(self.f)
。
相反,您获得的窗口来自Matplotlib - plt.plot
和plt.show
命令会弹出一个纯粹的matplotlib图。
要以你想要的方式获得Tkinter中的嵌入式数字,你所要做的就是重新做schart2来返回一个数字,而不要使用pyplot:
def schart2(stock_sym):
x = [1,2,3,4]
y = [20,21,20.5, 20.8]
fig = Figure()
axes = fig.add_subplot(111)
axes.plot(x,y)
return fig
此外:
您还需要删除self.canvas.show()
,因为它会导致关于'update_idletasks'属性的Tkinter错误,但我不足以让Tkinter专家知道那个,并且它是一个单独的问题(已经有一些关于SO的讨论)。还存在名称空间问题 - 将Tk.
从side=Tk.TOP, fill=Tk.BOTH
移开,因为您已完成from Tkinter import *
。