美文网首页
#在GUI中导入数据并画图-tkinter & matplotl

#在GUI中导入数据并画图-tkinter & matplotl

作者: 鹿呀鹿呀快开门 | 来源:发表于2019-11-25 21:52 被阅读0次

    基本思路

    最近学习用tkinter进行GUI编程,通过制作一个GUI界面,其中可以在电脑本地文件夹中导入csv数据,然后在GUI中嵌入利用matplotlib对csv文件中数据所作的图。

    具体项目

    本地电脑中有类似于如下的csv原始文件,其中存有各种材料在不同波长下材料的折射率和消光系数的数据。如下图所示为硅的折射率和消光系数数据。


    本地csv文件

    这种csv文档中,数据的保存方式如下,一共三列数据,分别对应波长Wavelength,折射率N和消光系数K。


    csv文件中数据
    因此,本项目的主要目标为:
    • 在GUI界面中具有一个按钮,点击后可以打开本地文件夹,选择文件
    • 一个文本框,选择文件后,文本框中显示文件路径
    • 一个按钮,点击可以进行图形绘制
    • 两个图像绘制框,一个显示不同波长下的NK,一个显示不同波长下的布儒斯特角数值,布儒斯特角通过计算得到

    代码及解释

    import tkinter as tk
    from tkinter import filedialog
    from tkinter import messagebox
    from matplotlib.pyplot import Figure
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    import pandas as pd
    import numpy as np
    
    
    class Application(tk.Tk):
    
        def __init__(self):
            super().__init__() # 有点相当于tk.Tk()        
            self.createWidgets()
    
        def createWidgets(self):
            self.title('Brewster Angle Calculator')
            self.columnconfigure(0, minsize=500)
            # 定义一些变量
            self.entryvar = tk.StringVar()
    
            # 先定义顶部Frame,用来放置下面的部件
            topframe = tk.Frame(self, height=80)
            topframe.pack(side=tk.TOP)
            
            # 顶部区域(四个部件)
            glabel = tk.Label(topframe, text='当前文件夹:')
            gentry = tk.Entry(topframe, textvariable=self.entryvar)
            gbutton = tk.Button(topframe, command=self.__openfile, text='选择文件')
            gbutton2 = tk.Button(topframe, command=self.draw, text='画图')
    
            # -- 放置位置
            glabel.grid(row=0, column=0, sticky=tk.W)
            gentry.grid(row=0, column=1)
            gbutton.grid(row=0, column=2)
            gbutton2.grid(row=0, column=3)   
            
            fig1 = Figure(figsize=(5,4), dpi=100)
            self.ax1 = fig1.add_subplot(111)
            self.ax3 = self.ax1.twinx()
    
            self.canvas1 = FigureCanvasTkAgg(fig1, master=self)
            self.canvas1.get_tk_widget().pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
            self.canvas1._tkcanvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
    
            fig2 = Figure(figsize=(5,4), dpi=100)
            self.ax2 = fig2.add_subplot(111)
            self.canvas2 = FigureCanvasTkAgg(fig2, master=self)
            self.canvas2.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
            self.canvas2._tkcanvas.pack(side=tk.RIGHT, fill=tk.BOTH, expand=1)
    
            
        def __openfile(self):
            '''打开文件的逻辑'''
            
            self.filename = filedialog.askopenfilename(title='打开csv文件', filetype=[('csv', '*.csv')]) # 打开文件对话框
            self.entryvar.set(self.filename) # 设置变量entryvar,等同于设置部件Entry
            
            if not self.filename:
                messagebox.showwarning('警告', message='未选择文件!')  # 弹出消息提示框
                     
        def draw(self):
            '''绘图逻辑'''
            self.data = pd.read_csv(self.filename)
            wavelength = self.data['Wavelength']
            N = self.data['N']
            K = self.data['K']
            BrewsterAngle = np.arctan(N) * 180 / np.pi
            
            self.ax1.clear()                  # 清除原来的Axes区域
            self.ax1.plot(wavelength, N, 'r', linewidth=3)  # 重新画
            self.ax3.plot(wavelength, K, 'b', linewidth=3)
            self.canvas1.draw()
    
            self.ax2.clear()                  # 清除原来的Axes区域
            self.ax2.plot(wavelength, BrewsterAngle, 'g', linewidth=3)  # 重新画
            self.canvas2.draw()
    
            self.ax1.set_xlabel('Wavelength(nm)')
            self.ax1.set_ylabel('N')
            self.ax3.set_ylabel('K')        
            self.ax2.set_xlabel('Wavelength(nm)')
            self.ax2.set_ylabel('Brewster Angle(Degree)')
    
        def addmenu(self, Menu):
            '''添加菜单'''
            Menu(self)
                 
    class MyMenu():
        def __init__(self, root):
            '''初始化菜单'''
            self.menubar = tk.Menu(root) # 创建菜单栏
            
            # 创建“帮助”下拉菜单
            helpmenu = tk.Menu(self.menubar, tearoff=0)
            helpmenu.add_command(label="关于", command=self.help_about)
            
            # 将前面菜单加到菜单栏
            self.menubar.add_cascade(label="帮助", menu=helpmenu)
            
            # 最后再将菜单栏整个加到窗口 root
            root.config(menu=self.menubar)
            
        def help_about(self):
            messagebox.showinfo('关于', '作者:Hunter \n verion 1.0 \n 感谢您的使用! \n hunter.zhang@aliyun.com ')  # 弹出消息提示框
            
        
    if __name__ == '__main__':
        # 实例化Application
        app = Application()
        
        # 添加菜单:
        app.addmenu(MyMenu)
        
        # 主消息循环:
        app.mainloop()
    

    结果

    • 运行程序


      初始界面
    • 导入数据


      得到文件路径
    • 画图


      完成的绘图

    相关文章

      网友评论

          本文标题:#在GUI中导入数据并画图-tkinter & matplotl

          本文链接:https://www.haomeiwen.com/subject/qcqswctx.html