【问题标题】:Replacing an existing bar graph with a new one by deleting the old one in Python通过在 Python 中删除旧的条形图,用新的条形图替换现有的条形图
【发布时间】:2019-02-26 13:22:21
【问题描述】:

我是 Python 新手。当我单击名为 CHANGE DATA 的按钮时,我期待 plt.close('all') 删除旧图形。相反,新图放置在旧图旁边(在其左侧)。更多点击会显示更多图表,但不会删除旧的。

我做错了还是这是一起使用 tkinterma​​tplotlib 的限制?

import tkinter as tk
from tkinter import Button
import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

matplotlib.use('TkAgg')

def displ_graf(datalst):
    ff = plt.figure(figsize=(5.6,4), dpi=100)
    xx = ff.add_subplot(1,1,1)
    nn = np.arange(len(datalst))
    bb = xx.barh(nn, datalst, 0.8)
    ff.tight_layout
    cc = FigureCanvasTkAgg(ff, master=ww)
    cc.draw()
    cc.get_tk_widget().pack(side=tk.RIGHT)

def graf2():
    plt.close('all')
    data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
    displ_graf(data2)

ww = tk.Tk()
ww.geometry('700x400')
ww.state('zoomed')
butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
butt3.place(x=790, y=100)

data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
displ_graf(data1)
ww.mainloop()

左图为点击按钮前的初始画面,右图为点击按钮后的画面

【问题讨论】:

    标签: python python-3.x matplotlib tkinter


    【解决方案1】:

    您可以使用 cc.get_tk_widget().destroy() 来做到这一点。但是您的代码似乎有点笨拙。所以也许看看这个example

    作为一个例子,它可以工作:

    import tkinter as tk
    from tkinter import Button
    import numpy as np
    import matplotlib
    matplotlib.use('TkAgg')
    
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt
    
    
    
    def displ_graf(datalst):
        ff = plt.figure(figsize=(5.6,4), dpi=100)
        xx = ff.add_subplot(1,1,1)
        nn = np.arange(len(datalst))
        bb = xx.barh(nn, datalst, 0.8)
        ff.tight_layout
        cc = FigureCanvasTkAgg(ff, master=ww)
        cc.draw()
        cc.get_tk_widget().pack(side=tk.RIGHT)
        return cc
    
    def graf2():    
        data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
        displ_graf(data2)
    
    def destroy():
        canv.get_tk_widget().destroy()
    
    ww = tk.Tk()
    ww.geometry('700x400')
    ww.state('normal')
    butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
    butt4 = Button(ww,text=' destroy ',command=destroy, height=1,width=15)
    butt3.place(x=790, y=100)
    butt4.place(x=500, y=100)
    
    data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
    canv = displ_graf(data1)
    ww.mainloop()
    

    但这里的问题是每次运行displ_graph时都会创建一个新的cc实例@

    【讨论】:

    • 我将canv.get_tk_widget().destroy() 移动到 graf2 的第一行,然后在其前面添加了global canv,并将最后一行更改为canv = displ_graf(data2),它不再添加图表在第二次单击或后续单击期间的左侧。最初,只有第一次点击替换了旧图表。
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多