在Tkinter画布小部件类中嵌入一个matplotlib图表

2024-09-30 01:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个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的部分有关。真的,乔治


Tags: 代码fromimportself图形matplotlib部件tkinter
1条回答
网友
1楼 · 发布于 2024-09-30 01:27:51

您根本没有使用这段代码访问Tkinter,因为您的函数schart2返回None,然后将其分配给self.f,并用于self.canvas = FigureCanvasTkAgg(self.f)。在

相反,您得到的窗口来自Matplotlib,plt.plot和{}命令将弹出一个纯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专家来解决这个问题,而且这是一个单独的问题(已经有一些讨论了)。还有一个命名空间问题-去掉Tk.,因为您已经完成了from Tkinter import *。在

相关问题 更多 >

    热门问题