0.前言
项目中使用python做近红外建模算法时,建模参数需要查看数据的谱图特征和相关系数才能判断,需要配置GUI交互界面。所需要的界面复杂度不高,且要求在Linux嵌入式设备上可以运行。这就需一款轻量化、具备基本功能的GUI框架。
1.框架调研
先后调研了pyqt5和tkinter两个gui框架,PyQt5是绑定Python的Qt应用程序框架。PyQt5支持Windows、Linux、UNIX、Android、MacOS和iOS平台。但是pyqt5的学习成本较高,依赖较多,打包后体积较大。Tkinter(即 tk interface) 是 Python 标准 GUI 库,简称 “Tk”;从本质上来说,它是对 TCL/TK 工具包的一种 Python 接口封装。Qt是一组C++库和开发工具,包括平台独立抽象图形用户接口、网络、线程、正则表达式、SQL数据库、SVG、OpenGL、XML、用户和应用程序设置、定位和定位服务、短程通信(NFC和蓝牙)、上网、3D动画、图表、3D数据可视化和应用商店接口。这些功能由1000多个类实现,这些类被封装成一组模块。
Tkinter是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行。Tkinter 编写的程序,也称为 GUI 程序,GUI (Graphical User Interface)指的是“图形用户界面”,它是计算机图形学(CG)的一门分支,主要研究如何在计算机中表示图形,以及利用计算机进行图形的计算、处理和显示等相关工作。tkinter框架简单,具有基本的控件,很适合从C#的winform过渡过来。而且时python自带的UI库,没有任何依赖,跨平台性也是可以保证。通常情况下不会使用 Tkinter 来开发较为复杂的桌面应用程序,这是由 Python 语言自身特点决定的,作为一种解释型语言和脚本语言,Python 并不具备开发复杂桌面应用的优势。
2.创建界面
class Win(tk.Tk):
def __init__(self):
super().__init__()
self.title("建模软件")
self.iconbitmap('Fpi.ico')
# win.resizable(0,0)
btn_w = 10
padx = 5
pady = 2
tk.Button(self, text="打开文件", width=btn_w, command=self.open_file).grid(row=0, column=0, padx=padx, pady=pady)
self.cmb_factor = ttk.Combobox(self, width=8)
self.cmb_factor.grid(row=1, column=0, padx=padx, pady=pady)
tk.Button(self, text="配置建模", width=btn_w, command=self.config_modeling).grid(row=2, column=0, padx=padx,
pady=pady)
tk.Button(self, text="开始建模", width=btn_w, command=self.start_modeling).grid(row=3, column=0, padx=padx,
pady=pady)
tk.Button(self, text="保存模型", width=btn_w, command=self.save_model).grid(row=4, column=0, padx=padx, pady=pady)
tk.Button(self, text="样本预测", width=btn_w, command=self.predict_sample).grid(row=5, column=0, padx=padx,
pady=pady)
self.txt_log = Text(self, width=120, height=40, undo=True, autoseparators=False)
self.txt_log.grid(row=0, rowspan=6, column=1, padx=10, pady=5)
# self.geometry('750x420')
self.config = None
self.__init_menu()
绑定右键下拉框
def __init_menu(self):
# 创建一个弹出菜单
menu = tk.Menu(self, tearoff=False)
menu.add_command(label="导出", command=self.export)
menu.add_command(label="清空", command=lambda: self.txt_log.delete('1.0', tk.END))
self.txt_log.bind('<Button-3>', lambda event: menu.post(event.x_root, event.y_root))
文件操作
def open_file(self):
# 从本地选择一个文件,并返回文件的目录
filename = filedialog.askopenfilename(filetypes=[('CSV', '*.csv')], initialdir=os.curdir)
if filename != '':
self.xy_data = csv_util.read_XYData(filename)
self.log(f'读取样品集成功{str(self.xy_data)}')
self.cmb_factor['value'] = tuple(self.xy_data.factors)
self.cmb_factor.current(0)
子窗体,需要集成TopLevel
class ConfigWin(Toplevel):
def __init__(self,xy_data:XYData,master):
Toplevel.__init__(self,master=master)
# self.btn = tkinter.Button(master=self, text="Quit", command=self.update_frequency)
# self.btn.pack(side=tkinter.BOTTOM)
self.config = ModelConfig()
self.__init_ui(row_start=2)
self.title("Embedding in Tk")
self.fig=self.__init_plot()
self.__plt_sample(xy_data)
# self.__plt_sample(xy_data)
self.xy_data=xy_data
# self.update_frequency()
self.geometry('850x750')
# self.mainloop()
打开子窗体,并等待操作结束
ui_config = ConfigWin(self.xy_data.get_match(self.cmb_factor.get()), self)
ui_config.wait_window()
2.总结
tkinter创建界面较简单,可以配合matplotlib显示精美图表。算法开发人员掌握此框架便可以开发出具有交互性的算法界面,方便研究人员调试和提升算法人员软件开发技能。百度搜索的结果可能大部分都推荐pyqt,pyqt虽然可以做出精美界面,但是依赖较多,打包后体积较大,另外学习成本也比较高,对于初学者,tkinter更适合快速做出简洁的界面。