[Asm] 纯文本查看 复制代码
#先声明,以下注释只是按个人理解写的,别杠,咋样方便记忆就咋样理解,初学者别深究,我只是个菜鸟,说深奥了我也不懂,何必自寻烦恼,影响自学的动力呢。
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() #循环等待所有控制的消息,另外这个不调用,整个窗体也不会显示