说到Python,我们常常想到的就是一个小窗口,黑黢黢的cmd窗口运行一下代码。
就像下图:
那Python可不可以做出来具有界面的程序呢?就像这样:
答案是可以的,那我们就要说一下Python GUI了。
GUI就是图形用户接口(GraphicalUser Interface)的简称,是可以进行互动操作,具有一定视觉体验的部分。
它的优势就在于可以互动操作,并且视觉效果比较好。
Python GUI的库
常见的pythonGUI的库有三个,Tkinter,WxPython以及PyQt。
-Tkinter
·是Python原生库,优势在于不用额外安装其它库,只要有Python就可以运行;
·对于WINDOWS,LINUX,UNIX,MAC OS系统的支持都非常友好,可以良好的运行在绝大多数的平台中;
·Tkinter简单易用,对于小的程序界面来说十分的方便快捷。
-wxPython
·是一个GUI工具箱,可以轻松创建图形用户界面程序;
·它也可以在多平台进行使用,它是一个用Python封装的wxWidgets包(C++包)通过以Python模块的方式来在Python中使用的;
·优势是快捷方便,但是相对于Tkinter来说,需要导入第三方库。
-PyQt
·这个库就比较高级了,它是python语言和QT库成功融合的产物;
·其基于Qt是目前最强大的GUI库之一,具有超过300个类,近6000个函数和方法;
·也是一个多平台的库,可以应用于 Linux、 Windows、Mac os等。
很多人在学习GUI应用的时候,都感觉比较困难,因为GUI和别的不太一样,GUI更多的是基于视觉上的处理,如果我们只是通过文字教程就很难学会它。
那我们今天就通过创建一个GUI的小应用通过制作一个压缩图片的小工具来初步学习GUI的操作,今天选择采用的是Tkinter库。
Tkinter库
我们细说一下Tkinter库,刚才说到了它的优点,包括其是Python原生库不用额外安装、支持多平台等诸多优点,也具备简单易用的优势。
但是,它的缺点也很明显:
·整个Tkinter的布局是通过代码完成的,写大程序,里面有很多控件,就相当的麻烦了;
·并且GUI工具不能通过拖拽来进行界面的设置,而全部都是用代码,也是遭到广大用户吐槽的点;
·Tkinter模块当中,常用的GUI模块主要功能是具备的,但相对于PYQT模块来说,很多功能被弱化了,有些内容藏的比较深,可能会让人误认为没有这个功能;
·API写的相对比较简单,方法属性寻找起来相对比较困难;
·Tkinter的效率相对来说比较低,主要是针对中大型GUI程序来说,当书写复杂的GUI程序的时候,Tkinter库的效率非常低,耗时就会非常长;
·Tkinter做出来的界面…相对来说是惨不忍睹了,比较丑。
本文还是选择用了Tkinter库进行这个压缩图片的小工具来进行初步的学习,也为后续学习其它GUI操作打下基础。
压缩图片小工具
首先分解一下需求,首先要给图片压缩,其次要用GUI来展示这个界面。那GUI部分就要包括几个部分,第一个,选择图片的按钮,第二个压缩按钮
图片处理的库,这里我选择 PIL库;
fromPILimportImageasimgfromtkinterimport*
引入两个库之后,先写出GUI界面;
defGUI_app(): app = Tk() Label(app, text='压缩小程序', font=('Arial',20,'bold')).pack()returnapp
调用了之后得到这个结果:
那我们还需要往里面加个可以表示你放入多少个图片的列表,在函数里面增加了。
Listbox(app,name='listbox',bg='#f2f2f2').pack(fill=BOTH,expand=True)
之后还缺两个按钮,一个是选择图片的按钮,一个是进行压缩的按钮;
Button(app, text='打开路径').pack()Button(app, text='开始压缩').pack()
这么看这个程序界面虽然完善了,但是还是有些丑,长宽有点怪想改变为300 * 400的大小,输入下面代码,这里面需要注意的是,这个乘号一定是这个x,不能是*。
app.geometry('300x400')
这次看起来就美观一些了。
GUI部分写完了,那就要向里面添加核心代码~
首先是打开路径的代码,这里面我们就要用到下面这行代码,这个代码会引入一个函数,才能打开对应的文件。
fromtkinter.filedialogimport*
为了方便获取路径,建立下面的字典,这样就可以通过键值对来获取对应的路径和文件名;
info= {'path':[]}
建立函数;
defopen_path(): filename = askopenfilenames()
之后我们要向listbox中添加对应的名字,这样我们就知道放入了哪些图片;
lbox = app.children['listbox'] #找控件 info['path'] = filenamesifinfo['path']:fornameinfilenames: lbox.insert(END,name.split('/')[-1])
这个结果就是,在列表中显示出来文件的名字,并且可以找到对应的文件,这样就可以在添加完文件之后,直接点击开始压缩,就可以对文件进行处理了。
那下面来进行压缩部分的代码:
def compress():forfilepath in info['path']: output ='你想输出的文件夹'name = filepath.split('/')[-1]image= img.open(filepath)image.save(output+'压缩'+name, quality=50)
这部分的代码其实很简单,因为这里面放了不止一个文件,所以要用一个循环来嵌套它;
output是保存的文件输出在哪里,name是获取到的文件名,image是要打开哪个文件;
这个代码中save(,quality=压缩百分比)这部分才是真正的核心,这里面为了方便看出来压缩我们设置为50。
但是这里面整个核心都写完了,但是程序并未写完,因为我们要给这两个函数分别引入到那两个对应的button里面去。
我们需要给最开始时候的两个button代码改掉;
Button(app, text='打开路径').pack()Button(app, text='开始压缩').pack()
改为:
Button(app,text='打开路径',command=”open_path”).pack()Button(app,text='开始压缩',command=”compress”).pack()
这样就将函数导入到按钮中了。
首先我们看下文件的大小:
看下输出的目标文件夹:
好,然后我们开始执行这个小程序:
好了,大家可能看到这个大小缩小为大约原来的一半儿了!这个GUI小程序就做好了~每次执行以下就好啦~
但是这里面我们不想和控制台窗口有关联了!想做一个真正的EXE小程序,这时候应该怎么办呢?
首先我们本身要有pyinstaller这个库,(没有的pip一下啦)
然后,找到对应的文件目录,然后在这个目录下进入cmd输入下列代码:
pyinstaller -F -w 文件名.py
等它执行完毕之后,就可以看到在对应的文件夹下面出现dist,里面就有一个可执行程序了 。
执行一下看看:
搞定了!(解释一下参数:-F 表示生成单个可执行文件;-w 表示去掉控制台窗口)
好了,这样我们就已经完整的用python做完了一个GUI界面并且打包成了EXE程序。
小编我有一个Python的qq学习交流群:639584010,里面有很多较新的教程和工具,如果你目前正处于转行和自学的迷茫阶段,欢迎入群,群里有很多大佬可以给你解疑答惑。