功能及使用如下:
1.点击按钮《选择照片路径》,在弹出的窗口中,按着ctrl多选照片,或者直接ctrl+a全选照片。
2.在界面的输入框中,输入要压缩的百分比数值 或 修改尺寸数值(例如高100 宽30)
3.按需点击按钮《尺寸输出保存》 或 点击按钮《压缩输出保存》
4.在弹出的保存窗口中,选择要保存到哪个文件夹,选择完要保存的文件夹后,稍等片刻,压缩或尺寸更改完毕,会自动弹出保存的文件夹窗口。
完整打包命令为:
1 |
pyinstaller -F -i 01.ico 01.py --noconsole |
其中-i为增加图标命令,图标名为当前打包目录下的01.ico文件 01.py是源码文件。–noconsole 顾名思义,不要输出的意思,也就是运行时只显示窗体,不显示黑色的cmd命令窗口。
以下是源码,源代码的注释比较详细,非常适合新手学习。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#先声明,以下注释只是按个人理解写的,别杠,咋样方便记忆就咋样理解,初学者别深究,我只是个菜鸟,说深奥了我也不懂,何必自寻烦恼,影响自学的动力呢。 from PIL import Image as img from tkinter import filedialog,Tk,Listbox,Button,BOTH,StringVar,Label,Entry,END from os import startfile #定义一个字典,里面含有路径列表,之所以定义字典,是因为可以在局部里直接调用,如果定义空列表,还需要在方法里加声明 gloal Files_Names={ "path":[] } def win_soft(): #画各类控件 app=Tk() #画主窗口 app.title("照片压缩") #设置主窗口标题 Label(app,text="照片压缩及剪裁",font=("微软雅黑",25,"bold")).pack() #画标签并设置显示的文字,字体,加粗 Listbox(app,name='l_b',bg="#f2f2f2",fg="red").pack(fill=BOTH,expand=True) #画列表框并指定名字,方便后续根据名字调用获取Listbox实例,指定背景,前景,显示方式 Button(app,text="选择照片路径",command=ui_update).pack(fill=BOTH) #command指定了当按下按钮,会调用哪个方法 Label(app, text="尺寸大小:自定义任意尺寸", font=("微软雅黑", 10)).pack(fill=BOTH, expand=True) defaul_val = StringVar(value='80') #创建一个StringVar类型的值,值是80 Entry(app,textvariable=defaul_val,name="scr_input_h").pack(fill=BOTH,expand=True) #textvariable只接收StringVar类型的值,所以这里传入上面的StringVar类型值,当成默认值 defaul_val = StringVar(value='80') #创建一个StringVar类型的值,值是80 Entry(app,textvariable=defaul_val,name="scr_input_w").pack(fill=BOTH,expand=True) #textvariable只接收StringVar类型的值,所以这里传入上面的StringVar类型值,当成默认值 #app.resizable(width=False, height=False) 设置窗体是否可以改变 Button(app, text="尺寸输出保存", command=scer_img).pack(fill=BOTH) # left Label(app, text="压缩百分比:0~95", font=("微软雅黑", 10)).pack(fill=BOTH, expand=True) defaul_val = StringVar(value='60') Entry(app,textvariable=defaul_val,name="ys_input").pack(fill=BOTH,expand=True) Button(app, text="压缩输出保存",command=compress).pack(fill=BOTH) #left app_width=300 #设置窗口宽度 app_height=500 #设置窗口高度 win_width=int((app.winfo_screenwidth()-app_width)/2) #设置窗口距离左上角原点的 宽度 屏幕总宽度-软件窗口宽度 再除2,即软件距离左侧窗口的宽度 转为整数,因为下面geometry只接受字符串型整数 win_height=int((app.winfo_screenheight()-app_height)/2) #设置窗口距离左上角原点的 高度 屏幕总宽度-软件窗口高度 再除2,即软件距离顶边的高度 转为整数,因为下面geometry只接受字符串型整数 app.geometry("%sx%s+%s+%s"%(app_width,app_height,win_width,win_height)) #设置窗口显示的宽高度 及 距离原点的长宽度 return app #把创建好的实例对象返回主程序,其中在各控件里加app,意思为绑定主窗口,届时可以用 app.children["name"] 来调用。 def ui_update(): file_names = filedialog.askopenfilenames() # 返回选择的文件夹里的文件路径 列表 if file_names!="": #只要选择的文件夹路径不为空 Files_Names["path"]=file_names #完整的照片路径赋值给 全局变量 list_box=a.children["l_b"] #读取出列表框对象 list_box.delete(0,END) #对象调用删除全部列表框 for i in file_names: list_box.insert(END,i.split("/")[-1]) #循环插入文件名到列表框 def compress(): file_names_new=filedialog.askdirectory() # 返回选择的保存图片的文件路径 列表 if file_names_new!="": #只要选择的文件夹路径不为空 for i in Files_Names["path"]: #读取出全局变量里的照片路径 img_byte=img.open(i) #根据照片路径循环打开要压缩的照片 img_byte.save(file_names_new+"/new_"+i.split("/")[-1],quality=a.children["ys_input"].get()) #压缩另存到新路径 startfile(file_names_new) #完成后自动打开 压缩图片所在的文件夹 def scer_img(): file_names_new=filedialog.askdirectory() # 返回选择的保存图片的文件路径 列表 if file_names_new!="": #只要选择的文件夹路径不为空 for i in Files_Names["path"]: #读取出全局变量里的照片路径 img_byte = img.open(i) #根据照片路径循环打开要压缩的照片 s_h=int(a.children["scr_input_h"].get()) #获取到要保存的尺寸高度 s_w=int(a.children["scr_input_w"].get()) # 获取到要保存的尺寸宽度 str_file_name=("%s/new_%sx%s_%s")%(file_names_new,str(s_h),str(s_w),i.split("/")[-1]) #保存的图片路径 img_byte.resize((s_w,s_h)).save(str_file_name) #用resize方法保存图片,即为裁剪后的。 startfile(file_names_new) # 完成后自动打开 压缩图片所在的文件夹 a=win_soft() #返回创建完所有控制的实例 a.mainloop() #循环等待所有控制的消息,另外这个不调用,整个窗体也不会显示 |
本文来自似水流年2015 ,本文观点不代表蓝洛水深立场,转载请联系原作者。