【问题标题】:Close/Unpack Object "matplotlib.backends.backend_tkagg.FigureCanvasTkAgg"关闭/解包对象“matplotlib.backends.backend_tkagg.FigureCanvasTkAgg”
【发布时间】:2015-09-30 21:05:33
【问题描述】:

这是获取图形并将其显示在 Tkinter 窗口上的代码。如何从 GUI 中解压/删除“画布”?

    from Tkinter import *
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

    def plot(x, y):
        fig = plt.figure()
        ax1 = fig.add_subplot(1,1,1)
        ax1.plot(x,y)
        return fig

    plt = plot(1,1)
    root = Tk()
    canvas = FigureCanvasTkAgg(plt, master=root)
    canvas.get_tk_widget().pack() 

【问题讨论】:

  • 通常你会破坏画布的 tk_widget。例如。 canvas.get_tk_widget().destroy()。但是,如果您只是想暂时隐藏情节,还有更好的方法。你想做什么?
  • 我正在尝试用另一种类型的画布替换它。例如,我的 GUI 使用 matplotlib 在图形上显示信息,然后使用 tkinter 画布小部件显示另一组信息。

标签: python matplotlib


【解决方案1】:

如果您想删除绘图并释放父框架/窗口,请致电canvas.get_tk_widget().destroy()

例如:

import Tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

def main():
    fig = plot(range(10), range(10))
    root = tk.Tk()
    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.get_tk_widget().pack()

    root.bind_all('<Button-1>', lambda event: remove_plot(canvas))

    root.mainloop()

def plot(x, y):
    fig = Figure()
    ax1 = fig.add_subplot(1,1,1)
    ax1.plot(x,y)
    return fig

def remove_plot(canvas):
    canvas.get_tk_widget().destroy()

main()

这只会破坏图形的 tk 小部件。该数字仍然存在并且可以再次添加,假设它没有超出范围并被垃圾收集。 (此外,由于我们没有使用 pyplot 状态机,因此该图形将像任何其他对象一样被垃圾收集。)

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多