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

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

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,986评论 1 3
  • @Author : Roger TX (425144880@qq.com) @Link : https:/...
    Roger田翔阅读 4,946评论 0 5
  • 夜雨 哗啦啦...... 独自一人走在夜雨中的人行横道, 撑起雨伞将夜雨阻挡。 空旷的街道上只有我和朦胧的灯光, ...
    Eyu蒋子善阅读 179评论 0 0
  • 减肥的你还在时时刻刻的饿自己或者每天花几个小时用来健身吗?你太落伍了!相反,只要你吃对了,就能让你更富激情、让你精...
    晃悠的老刘忙阅读 981评论 2 9
  • 1.边际成本 批量生产的边际成本随着产量的增加而降低。所以很多商家明白这个道理,在保持现有盈利的模式,推出一些折扣...
    随心琉璃阅读 234评论 0 0