首页 > 解决方案 > 销毁并重新创建使用 FigureCanvasTkAgg 实现的 matplotlib 图

问题描述

我正在创建一个 Tkinter 程序,用户可以在其中输入一个值以使用 matplotlib-venn 创建一个阴影维恩图。这是我的代码的一部分,在输入公式后单击“计算”按钮时给出说明,该公式在 Tkinter 的画布上绘制 matplotlib 图。

def whenClicked():
    if str(selected.get()) == '3':
        plot1, v1 = configuration.createVenn3(formula.get())
        diagram = FigureCanvasTkAgg(plot1, master=window)
    if str(selected.get()) == '2':
        plot2, v2 = configuration.createVenn2(formula.get())
        diagram = FigureCanvasTkAgg(plot2, master=window)
    diagram.get_tk_widget().pack()
    diagram.draw()

if语句是判断维恩图中的圈数,是否让matplotlib-venn在matplotlib-venn的2圈或3圈系统中绘制图。所以从字面上看,顺序是配置plot和v,然后定义图表,即canvas的对象,然后在Tkinter的canvas上绘制图表。

因此 FigureCanvasTkAgg 函数将创建一个名为 diagram 的新变量并将配置的图表绘制到 GUI 上。但是,在这里我很好奇如何配置 Python 以在用户输入新公式并再次单击按钮时删除(销毁)图表并创建(绘制)新图表。目前在上面的设置中,当我用新公式再次单击按钮时,新图表将绘制在旧图表下方而不破坏旧图表,所以这不是一个好主意。我希望新图表将绘制在与旧图表完全相同的位置。

有任何想法吗?

标签: pythonmatplotlibtkinter

解决方案


如果没有Minimal、Complete 和 Verifiable example的代码,就不可能用一些代码回答你的问题,但基本上你不应该在每次绘制某些东西时重新创建一个新的 Figure / FigureCanvasTkAgg。

基本思想是,您在应用程序初始化期间创建了一次 Figure + FigureCanvasTkAgg,并且可能同时在该图形上创建了一个 Axes。

然后你应该编写你的绘图函数,以便它接受轴作为参数。这样,在处理按钮单击的函数中,您可以清除轴的内容 ( Axes.cla() ),并使用绘图函数在现有轴中绘制新图表。


推荐阅读