我正在尝试创建一个Tkinter小部件类,它在画布对象中嵌入matplotlib图形。我编写的代码几乎可以正常工作,但当小部件关闭时似乎无法正常退出。这是我使用的代码。这不是我正在使用的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()
当我运行这段代码时,这个小部件被正确地绘制出来并按预期运行,但是当我单击关闭图标按钮时,小部件从屏幕上消失了,但是代码继续运行,空闲提示再也不会出现,取而代之的是idle提示符只有一个闪烁的光标,但没有提示。通常,当我创建这样的小部件时,当我单击关闭图标按钮时,小部件关闭,底层代码也会退出,返回到正常的空闲提示。如果有人对如何让这个代码正确退出有任何想法,我将非常感谢你的帮助。我假设问题与代码中嵌入matplotlib的部分有关。真的,乔治
您根本没有使用这段代码访问Tkinter,因为您的函数schart2返回
None
,然后将其分配给self.f
,并用于self.canvas = FigureCanvasTkAgg(self.f)
。在相反,您得到的窗口来自Matplotlib,}命令将弹出一个纯Matplotlib图形。在
plt.plot
和{要以您想要的方式在Tkinter中获取嵌入的图形,只需重新执行schart2以返回图形,并且不要使用pyplot:
此外:
您还需要删除
self.canvas.show()
,因为它会导致一个关于'update_idletasks'属性的Tkinter错误,但是我还没有足够的Tkinter专家来解决这个问题,而且这是一个单独的问题(已经有一些讨论了)。还有一个命名空间问题-去掉Tk.
,因为您已经完成了from Tkinter import *
。在相关问题 更多 >
编程相关推荐