实战之python GUI压缩小程序

说到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,里面有很多较新的教程和工具,如果你目前正处于转行和自学的迷茫阶段,欢迎入群,群里有很多大佬可以给你解疑答惑。

你可能感兴趣的:(实战之python GUI压缩小程序)