前段时间写了一个从.dat文件读取数据转移到.xlsx文件里面的一个脚本,本质上和First principle calculation 没有什么关系,有点挂羊头卖狗肉的感觉,所以单开了一个Python的分类:P
之前的script(参见让搬砖变得轻松——python操作excel用的脚本)是完全的文本的页面,所有的东西都是靠手动文本输入然后运行的,虽然完成任务还OK,但是每次都要去找文件夹的info然后copy paste文件path,就觉得很烦了,于是就想能不能给他加一个前端(其实就是一个输入的窗口)呢?
因为疫情哪也去不了,反正都是在家呆着,说干就干,首先就去查了一下python的GUI的包,发现python3.7其实内置了一个叫做tkinter的模块,直接就对接了mac的GUI接口,对于懒人的我来说简直太美好了,虽然有很多大大也说了tkinter有很多坑啥的,所以用Qt之类的,不过对于这个界面要求没那么高的我来说,tkinter完全够用了,毕竟只是做一个简单的可视化操作
1. 前期准备
首先,先说一下这个tkinter,这个东西在python3.7里是可以自带的,所以不需要再去安装,而且就算安装,也不是用pip安装的!这个坑其实还挺滑稽的,我觉得应该不止我一个人试过
pip3 install tkinter
这种辣眼睛的操作的吧,不过这里就总结一下,千万不要这样,因为这个tkinter好像就不是一个这样的包,如果真的需要安装,请移步:https://www.activestate.com/products/tcl/,这里不再赘述,毕竟就是为了不需要额外安装才选择的tkinter
关于tkinter的一些功能的总结可以去看看这两位大大的blog:
https://www.cnblogs.com/aland-1415/p/6849193.html,https://blog.csdn.net/weixin_33726943/article/details/92427211,这里不多赘述了
整理一下思路大概就是:我们需要一个窗口来输入我们生成的summary文件的名字(这步其实可有可无,毕竟summary就叫sum.xlsx也完全可以,主要是想联系一下窗口的指令)——>可视化选择文件输出的路径——>在指定路径下生成一个.xlsx文件——>可视化选择读入文件的路径,也就是数据的parent文件夹——>运行我们之前的script写入数据
这样的好处就是可以不用每次使用的时候都手动的去copy paste文件的path,不用每次都打开程序的代码去进行编辑,这样可以防止出现一些不必要的误操作,而且省时省力
2. 代码实现
获得文件名字的代码大概就是这样:
def getname():
name = file_name.get()
if name != '':
messagebox.showinfo('File name read', 'The file name is %s, click OK to choose file path' % name)
getpath(name)
window.quit()
else:
messagebox.showinfo('Error', 'Please enter at least one character as filename!')
messagebox.showinfo这个函数是一个弹窗的函数(对,就是你在用程序的时候的那些弹窗,里面是('Title', 'Content text')这样一个结构,所以输出的窗口就是这样的
原理都是相同的,后面的一系列messagebox也是用这个方法做出来的,其实就是起到了prompts的作用
getname里面调用了一个getpath的函数,是为了在获得名字之后自动跳转到获得path的界面,getpath的函数如下:
def getpath(name):
root = tk.Tk()
root.withdraw()
path_xlsx = filedialog.askdirectory()
messagebox.showinfo('File path', 'Your chosen file path is %s, click OK to choose .dat file path' % path_xlsx)
book_name_xlsx = path_xlsx + r'/%s.xlsx'% name
# .xlsx file path where we want to generate this file
wb = Workbook()
wb.save(book_name_xlsx)
# Create and save file as given name and path
root2 = tk.Tk()
root2.withdraw()
path_dat_parent = filedialog.askdirectory()
messagebox.showinfo('Choose .dat file parent path', 'Your chosen . dat file parent path is %s, '
'click OK to continue' % path_dat_parent)
两次弹窗选择path,分别是选择输出和读入的两个path,选择path的界面就是本地的选择path的那个窗口,因为这个tkinter直接接入了本地的GUI,我在中间两次弹窗中间加入了一些prompts,方便记忆,在这段函数之后加入我们之前script里面的写入数据的函数,就大功告成了
接下来,我们在main function里面调用他们
if __name__=='__main__':
# Create a main menu, which contains filename input and a prompt
window = tk.Tk() #create a window
window.title('Text to xlsx program') #Title of the window
window.geometry('600x400') #Window size setting
tk.Label(window, text='File name').place(x=150, y=130) # a text label and its name and position
tk.Label(window, text='Please enter filename in the box, then click "OK"').place(x=130, y=180)
file_name = tk.StringVar()
entry_usr_name = tk.Entry(window, textvariable=file_name) # an empty textbox for reading input filename
entry_usr_name.place(x=250, y=130)
get_name_button = tk.Button(window, text='OK', command=getname) #invoke getname when you click OK button
get_name_button.place(x=300, y=250)
window.mainloop()
main function里面我直接写了主窗口的代码,感觉这样可能会被骂,但是好像为了可以让getname用到file_name这个variable,写在这里比较方便一些,最后window.mainloop()让窗口开始运作,到这里代码就结束了
这样就实现了之前的可视化读入,不需要每次都对输入的地址进行手动的改写,而且地址的选择更加直观
这个最后运行的时候会出现一个这样的warning,不过看stackoverflow上大大们说的,似乎是因为mac OS的问题,有两个东西是identical的,所以好像并不会有什么影响,参考:https://stackoverflow.com/questions/46999695/class-fifindersyncextensionhost-is-implemented-in-both-warning-in-xcode-si