完整打包命令为:pyinstaller -F -i 01.ico 01.py --noconsole
其中-i为增加图标命令,图标名为当前打包目录下的01.ico文件 01.py是源码文件。--noconsole 顾名思义,不要输出的意思,也就是运行时只显示窗体,不显示黑色的cmd命令窗口。
功能及使用如下:
1.点击按钮《选择照片路径》,在弹出的窗口中,按着ctrl多选照片,或者直接ctrl+a全选照片。
2.在界面的输入框中,输入要压缩的百分比数值 或 修改尺寸数值(例如高100 宽30)
3.按需点击按钮《尺寸输出保存》 或 点击按钮《压缩输出保存》
4.在弹出的保存窗口中,选择要保存到哪个文件夹,选择完要保存的文件夹后,稍等片刻,压缩或尺寸更改完毕,会自动弹出保存的文件夹窗口。
#先声明,以下注释只是按个人理解写的,别杠,咋样方便记忆就咋样理解,初学者别深究,我只是个菜鸟,说深奥了我也不懂,何必自寻烦恼,影响自学的动力呢。
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() #循环等待所有控制的消息,另外这个不调用,整个窗体也不会显示