让自己的Script更好用——使用tkinter打造Python脚本程序的可视化GUI窗口(新手向)

前段时间写了一个从.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.htmlhttps://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函数的输出结果

原理都是相同的,后面的一系列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的界面就是本地的选择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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349