如何使用 tkinter 和 matplotlib 在标签框中绘制图形?

石头无聊

我正在使用tkinter制作一个简单的 GUI matplotlib我想在 a 内绘图LabelFrame,但是当我尝试使用新条目再次绘图时,它会将新图形与旧图形重叠。我怎样才能只绘制最后一张图?我几乎可以肯定问题在于最后几行代码或我声明框架的方式。我的计划是有一个带有更多图表的窗口,每个图表都在自己的框架中。

这是我累了:

from tkinter import *
import tkinter as Tk
from tkinter import ttk
from matplotlib import pyplot as plt
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def main():

    root = Tk.Tk()
    gui = Window(root)
    gui.root.mainloop()

    return None
class Window:
    def __init__(self,root):
        self.root = root
        self.root.title("Overpressure Estimation")
        self.root.geometry('1400x500')

        parameters_frame =LabelFrame(self.root, text="Blast parameters", padx=20,pady=20)
        parameters_frame.pack(padx=1,pady=1)
        self.parameters_frame = parameters_frame

        graph_frame =LabelFrame(self.root, text="Graphs", padx=20,pady=20)
        graph_frame.pack(padx=10,pady=10)

        self.graph_frame = graph_frame

        self.charge = 100
        self.distance = 100
        self.kasite = 516
        self.asite = -1.45


        charge = Label(self.parameters_frame ,  text = "Charge Q (Kg)")
        self.charge_entry = Entry(self.parameters_frame ,  width = 15)
        self.charge_entry.grid(row=0, column=1)
        charge.grid(row=0, column=0)

        distance = Label(self.parameters_frame ,  text = "Distance (m)")
        self.distance_entry = Entry(self.parameters_frame ,  width = 15)
        self.distance_entry.grid(row=1, column=1)
        distance.grid(row=1, column=0)

        kasite = Label(self.parameters_frame ,  text = "Site constant (K)")
        self.kasite_entry = Entry(self.parameters_frame ,  width = 15)
        self.kasite_entry.grid(row=2, column=1)
        kasite.grid(row=2, column=0)

        asite = Label(parameters_frame ,  text = "Site exponent (a)")
        self.asite_entry = Entry(self.parameters_frame ,  width = 15)
        self.asite_entry.grid(row=3, column=1)
        asite.grid(row=3, column=0)



        button1 = Button(self.parameters_frame, text = "Calculate",command = self.update_values)
        parameters_frame.bind("<Return>", self.update_values)
        self.plot_values()
        button1.grid(row=5, column=1)
        pass

    def update_values(self, event=None):

        self.charge = int(self.charge_entry.get())
        self.distance = int(self.distance_entry.get())
        self.kasite = int(self.kasite_entry.get())
        self.asite = float(self.asite_entry.get())
        self.plot_values()
        return None

    pass

    def plot_values(self):

        # GRAPH
        z1 = [np.round(10 * np.log10((((((i/(self.charge**(1/3)))**self.asite) * self.kasite)/(0.00002))**2)),0) 
                       for i in np.arange(0.1,self.distance + 1) ]

        line_1 = [120 for i in range(1,self.distance + 1)]
        line_2 = [125 for i in range(1,self.distance + 1)]
        line_3 = [133 for i in range(1,self.distance + 1)]
        x1 = np.arange(1, self.distance + 1) 

        figure1 = plt.figure(figsize = (6,5), dpi = 100)
        figure1.add_subplot(111)

        plt.plot(z1,label="Decay Curve")
        plt.plot(x1, line_3,'b--',label="130 dbL: Maximum for Structural Damage Level" )
        plt.plot(x1, line_2,'r--',label="125 dbL: Maximum for Human Comfort Level" )
        plt.plot(x1, line_1,'g--',label="120 dbL: Annoying" )
        plt.legend()
        plt.xlabel('Distance (m)')
        plt.ylabel('Sound  Pressure Level(dBL)',labelpad=1)
        plt.title('SPL DECAY')
        plt.xscale('log')
        plt.grid(True, which="both", ls="-")

        chart = FigureCanvasTkAgg(figure1,self.graph_frame)
        chart.get_tk_widget().pack()
   
      
        return None
    pass
main()
西提兹

你可以试试这个:

from tkinter import *
import tkinter as Tk
from tkinter import ttk
from matplotlib import pyplot as plt
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def main():

    root = Tk.Tk()
    gui = Window(root)
    gui.root.mainloop()

    return None
class Window:
    def __init__(self,root):
        self.root = root
        self.root.title("Overpressure Estimation")
        self.root.geometry('1400x500')

        parameters_frame =LabelFrame(self.root, text="Blast parameters", padx=20,pady=20)
        parameters_frame.pack(padx=1,pady=1)
        self.parameters_frame = parameters_frame

        graph_frame =LabelFrame(self.root, text="Graphs", padx=20,pady=20)
        graph_frame.pack(padx=10,pady=10)

        self.graph_frame = graph_frame

        self.charge = 100
        self.distance = 100
        self.kasite = 516
        self.asite = -1.45

        charge = Label(self.parameters_frame ,  text = "Charge Q (Kg)")
        self.charge_entry = Entry(self.parameters_frame ,  width = 15)
        self.charge_entry.grid(row=0, column=1)
        self.charge_entry.insert(0,7)
        charge.grid(row=0, column=0)

        distance = Label(self.parameters_frame ,  text = "Distance (m)")
        self.distance_entry = Entry(self.parameters_frame ,  width = 15)
        self.distance_entry.grid(row=1, column=1)
        distance.grid(row=1, column=0)
        self.distance_entry.insert(0,7)
        kasite = Label(self.parameters_frame ,  text = "Site constant (K)")
        self.kasite_entry = Entry(self.parameters_frame ,  width = 15)
        self.kasite_entry.grid(row=2, column=1)
        kasite.grid(row=2, column=0)
        self.kasite_entry.insert(0,7)
        asite = Label(parameters_frame ,  text = "Site exponent (a)")
        self.asite_entry = Entry(self.parameters_frame ,  width = 15)
        self.asite_entry.grid(row=3, column=1)
        asite.grid(row=3, column=0)
        self.asite_entry.insert(0,7)

        button1 = Button(self.parameters_frame, text = "Calculate",command = self.update_values)
        parameters_frame.bind("<Return>", self.update_values)
 
        button1.grid(row=5, column=1)
        
        self.test()
        frame=Frame(self.graph_frame)
        frame.pack()
        self.frame=frame
        chart = FigureCanvasTkAgg(self.figure1,self.frame)
        chart.get_tk_widget().pack()
    
        self.chart =chart

    def update_values(self, event=None):

        self.charge = int(self.charge_entry.get())
        self.distance = int(self.distance_entry.get())
        self.kasite = int(self.kasite_entry.get())
        self.asite = float(self.asite_entry.get())
        self.plot_values()
        return None
    
    def test(self):
        z1 = [np.round(10 * np.log10((((((i/(self.charge**(1/3)))**self.asite) * self.kasite)/(0.00002))**2)),0) for i in np.arange(0.1,self.distance + 1) ]
        line_1 = [120 for i in range(1,self.distance + 1)]
        line_2 = [125 for i in range(1,self.distance + 1)]
        line_3 = [133 for i in range(1,self.distance + 1)]
        x1 = np.arange(1, self.distance + 1) 
        figure1 = plt.figure(figsize = (6,5), dpi = 100)
        figure1.add_subplot(111)
        
        self.figure1=figure1
        plt.plot(z1,label="Decay Curve")
        plt.plot(x1, line_3,'b--',label="130 dbL: Maximum for Structural Damage Level" )
        plt.plot(x1, line_2,'r--',label="125 dbL: Maximum for Human Comfort Level" )
        plt.plot(x1, line_1,'g--',label="120 dbL: Annoying" )
        plt.legend()
        plt.xlabel('Distance (m)')
        plt.ylabel('Sound  Pressure Level(dBL)',labelpad=1)
        plt.title('SPL DECAY')
        plt.xscale('log')
        plt.grid(True, which="both", ls="-")

    def plot_values(self):
        self.test()
        self.frame.destroy()
        frame=Frame(self.graph_frame)
        frame.pack()
        self.frame=frame
        chart = FigureCanvasTkAgg(self.figure1,self.frame)
        chart.get_tk_widget().pack()

        return None
    pass
main()

我们做了一些伎俩,我们已经取得了新的框架,作为家长帧FigureCanvasTkAgg,如果我们要创造新的FigureCanvasTkAgg,然后我们就可以摧毁父框架作出新FrameFigureCanvasTkAgg

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

需要帮助使用 matplotlib 在 tkinter 中绘制图形

使用Pandas和Matplotlib丢失数据并绘制图形

如何使用Matplotlib在Spyder中绘制图形?

使用pandas和matplotlib,当我排除一些行时如何绘制图形?

使用 matplotlib 绘制图形

使用 matplotlib 绘制图形,使用 X11 和 OS X 通过 ssh

如何使用R,Java和JRI绘制图形?

使用Tkinter实时读取线程中的高频数据并实时绘制图形

在Jupyter iPython Notebook中使用matplotlib绘制图形

使用 matplotlib 绘制图形时出错

Python Matplotlib - 如何从具有 2 列的表中绘制图形

Matplotlib-仅使用Y坐标突出显示已绘制图形中的点

如何在R中按标签绘制图形

如何在X轴和y轴上绘制图形是R中的函数?

Python:使用 NetworkX 和 mplleaflet 绘制图形

使用“gridExtra”和多个方面并排绘制图形

如何在python中使用matplotlib在图像上绘制图形?

如何使用“ matplotlib.pyplot”在不同的窗口中绘制图形?

如何在Matplotlib中的colormesh图上绘制图像?

使用matplotlib并排绘制图像

使用for循环matplotlib绘制图例

使用Matplotlib Python绘制图

如何使用Offset和End。(xlDown)选择要绘制图形的数据

如何使用 chart.js 仅绘制图形和 Xaxis 网格线

如何使用networkx和d3py绘制图形

如何使用循环和 system.out.print/println 绘制图形

我如何修改此代码,以免每次都重新绘制图形,matplotlib

在matplotlib中使用图,轴或图形绘制图之间有什么区别?

使用matplotlib绘制图形,其中X轴值分布不均匀