我最近初学Python,学习到了Thinker部分,心血来潮做了一个图片小工具,我感觉我自己好像是码了一座屎山。下面我分几个部分来讲解一下我的思路,以及具体的步骤。

第一步,先看源码:

部分地方我作了注释。

import tkinter as tk
import os
from PIL import Image as ime
from tkinter import *
import tkinter.filedialog  # 注意次数要将文件对话框导入
import tkinter.messageboxmainWindow = Tk()  # 创建主窗体
mainWindow.geometry('300x350+300+300')  # 设置主窗体大小。位置
mainWindow.iconbitmap('./icon/caomei.ico')  # 设置窗体图标,图标必须是ico格式
mainWindow.title("png转ico小工具")  # 设置主窗体标题
mainWindow.resizable(width=False, height=False)  # 不允许主窗体修改大小
# 创建一个frame窗体对象,用来包裹标签
frame = Frame(mainWindow, relief=SUNKEN, borderwidth=2, width=450, height=250)
# 在水平、垂直方向上填充窗体
frame.pack(side=TOP, fill=BOTH, expand=1)filenameVar = tk.StringVar()  # 定义动态变量值
filetoVar = tk.StringVar()TishiString = "这是一个纯Python-Tkinter写的小工具。在使用的过程中请注意以下事项:\n" \"1、尽量使用<选择图片>按钮,复制上去的路径有可能出错。\n" \"2、这是一个可以批量修改的小工具,但是,路径文件夹内不能有其他的文件,或者文件夹。\n" \"3、在程序运行过程中,不能更改文件路径、选择更改图片大小,以及重复点击其他按钮。否则容易出现意想不到的错误\n"def askfile():filename = tkinter.filedialog.askdirectory(initialdir='C:')print(type(filename))print(filename)if filename != '':filenameVar.set(filename)if filetoVar.get() == '':filetoVar.set(filename)passpasselse:filenameVar.set('您没有选择任何文件')passpassdef tofile():filetoname = tkinter.filedialog.askdirectory(initialdir='C:')print(filetoname)if filetoname != '':filetoVar.set(filetoname)passelse:filetoVar.set(filenameVar.get())passpassframe_TuPanXuanZE = tk.LabelFrame(frame, text="图片路径选择")
frame_TuPanXuanZE.place(x=10, y=10, width=270, height=90)XZButton = tk.Button(frame_TuPanXuanZE, text="选择图片", command=askfile)
XZButton.grid(row=0, column=0)XZEntry = tk.Entry(frame_TuPanXuanZE, textvariable=filenameVar, width=28)
XZEntry.grid(row=0, column=1)SCButton = tk.Button(frame_TuPanXuanZE, text="输出图片", command=tofile)
SCButton.grid(row=1, column=0)SCEntry = tk.Entry(frame_TuPanXuanZE, textvariable=filetoVar, width=28)
SCEntry.grid(row=1, column=1)frame_TuPianSize = tk.LabelFrame(frame, text="选择图片大小")
frame_TuPianSize.place(x=10, y=110, width=88, height=155)frame_TuPianTiShi = tk.LabelFrame(frame, text="提示信息")
frame_TuPianTiShi.place(x=108, y=110, width=172, height=155)
sbar1 = tk.Scrollbar(frame_TuPianTiShi)
sbar1.pack(side=RIGHT, fill=Y)
TSText = tk.Text(frame_TuPianTiShi, yscrollcommand=sbar1.set)
TSText.pack(fill='both')
sbar1.config(command=TSText.yview)
TSText.insert(END, '这里是进度显示区域,如果使用有问题,请点击提示信息按钮!\n')def clickZHButton():try:# 设置图片大小。默认情况下为 16*16大小size_ico = (16, 16)if v.get() == 0:size_ico = (16, 16)elif v.get() == 1:size_ico = (32, 32)elif v.get() == 2:size_ico = (64, 64)elif v.get() == 3:size_ico = (128, 128)elif v.get() == 4:size_ico = (256, 256)ImgFiler = str(XZEntry.get())ImgPath = ImgFilersave_Path = str(SCEntry.get())save_Path += '/'print("按钮中save_Path:" + save_Path)for file_name in os.listdir(ImgPath):print(file_name)ico_name = file_name.split('.')[0] + '.ico'# tkinter中也有Image,这里直接使用Image.open(ImgPath),会直接提示Image没有Open方法,# 然后抛出异常ico = ime.open(os.path.join(ImgPath, file_name)).resize(size_ico)path = os.path.join(save_Path, ico_name)print("按钮中path:" + path)ico.save(path)info = '{} --> {},成功!\n'.format(file_name, ico_name)TSText.insert(END, info)  # 设置在最后的位置插入信息TSText.see("end")  # 设置每次显示最后一条print('生成完毕,{} --> {}'.format(file_name, ico_name))passpassexcept (AttributeError, IOError):TSText.insert(END, "图片路径或尺寸选择错误\n")TSText.see("end")passpass# IntVar() 用于处理整数类型的变量
v = tk.IntVar()
# 根据单选按钮的 value 值来选择相应的选项
v.set(0)
# 添加单选按钮
site = [('16X16', 0),('32X32', 1),('64X64', 2),('128X128', 3),('256X256', 4)]
for text, number in site:sizeRadioButton = tk.Radiobutton(frame_TuPianSize, text=text, variable=v, value=number)sizeRadioButton.pack(anchor='w')passZHButton = tk.Button(frame, text="一键生成ico图标",relief=GROOVE, command=clickZHButton)
ZHButton.place(x=150, y=280, width=130, height=30)def cleanButton():if tk.messagebox.askokcancel("提示", " 你确定要清除提示信息框内容吗? "):TSText.delete(1.0, tk.END)TSText.insert(END, '这里是进度显示区域\n')passpasscleanButton = tk.Button(frame, text="清除提示信息框内容", relief=GROOVE,command=cleanButton)
cleanButton.place(x=10, y=280, width=130, height=30)def TishiButton():tk.messagebox.showinfo("使用注意事项",TishiString)passTishiButton = tk.Button(frame,text="提示信息",relief=GROOVE,command=TishiButton)
TishiButton.place(x=10, y=315, width=270, height=30)# 显示窗口
mainloop()

第二步,软件的运行截图:

第三步,软件

png转图片小工具这个是软件的下载地址,大家可以去看看。如果有python运行环境的,可以直接复制源码到IDE工具,运行也能得到想同的结果。(如果源码不能运行,请把代码中的mainWindow.iconbitmap('./icon/caomei.ico') # 设置窗体图标,图标必须是ico格式这一句注释掉就行。)

第四步,代码块

界面绘制部分

通过place()这一布局管理器,在frame上画出三个LabelFrame,分别是“路径选择”、“选择图片大小"和”提示信息“,当然,最下面的三个按钮,也是通过place()布局管理器画出来的。

TishiButton.place(x=10, y=315, width=270, height=30)

x,y代表控件左上角坐标,width、height代表控件的宽高。

图片路径的选择

在这里定义了两个个StringVar变量,分别是filenameVar、filetoVar。这两个变量主要是用来修改两个输入框里的内容。

def askfile():#  创建一个文件选择对话框,返回值为选择路径,initialdir参数为意义为默认打开路径filename = tkinter.filedialog.askdirectory(initialdir='C:')if filename != '': #  filename 不为空,代表已经选择好目录。filenameVar.set(filename)if filetoVar.get() == '':  #  如果第二个输入框为空,就将第一个路径填入到第二个框中。filetoVar.set(filename)passpasselse: # 否则,用户没有选择任何文件filenameVar.set('您没有选择任何文件')passpass

单选框的创建

定义IntVar变量主要是为了查看用户选择哪一个单选框。

# IntVar() 用于处理整数类型的变量
v = tk.IntVar()
# 根据单选按钮的 value 值来选择相应的选项
v.set(0) #  设定,初始值为第一个单元框
# 添加单选按钮
site = [('16X16', 0),('32X32', 1),('64X64', 2),('128X128', 3),('256X256', 4)]
for text, number in site:sizeRadioButton = tk.Radiobutton(frame_TuPianSize, text=text, variable=v, value=number)sizeRadioButton.pack(anchor='w')pass

图片的具体处理函数

def clickZHButton():try:# 设置图片大小。默认情况下为 16*16大小# size_num = int(input("请输入16,32,64,128,256尺寸:"))size_ico = (16, 16)if v.get() == 0:size_ico = (16, 16)elif v.get() == 1:size_ico = (32, 32)elif v.get() == 2:size_ico = (64, 64)elif v.get() == 3:size_ico = (128, 128)elif v.get() == 4:size_ico = (256, 256)# 获取连个输入框的值ImgPath = str(XZEntry.get())save_Path = str(SCEntry.get())save_Path += '/'# 在第二输入框的值末尾添加路径分割符号#  遍历路径ImgPath下所有对象for file_name in os.listdir(ImgPath):# 为每一个新的ico对象赋予和原图一样的名字ico_name = file_name.split('.')[0] + '.ico'# tkinter中也有Image,这里直接使用Image.open(ImgPath),会直接提示Image没有Open方法,# 然后抛出异常#  使用PIL包中的Image对象的Open方法来打开,路径为ImgPath,名字为file_name的文件,#  通过resize方法来重新设定图片大小,并且返回新的对象icoico = ime.open(os.path.join(ImgPath, file_name)).resize(size_ico)#  os包中的join函数为,组合save_Path路径和ico_name名字,形成一个新的路径path = os.path.join(save_Path, ico_name)#  将ico对象保存到path路径下ico.save(path)#  在“提示信息”中打印相应的成功信息info = '{} --> {},成功!\n'.format(file_name, ico_name)TSText.insert(END, info)  # 设置在最后的位置插入信息TSText.see("end")  # 设置每次显示最后一条passpassexcept (AttributeError, IOError):TSText.insert(END, "图片路径或尺寸选择错误\n")TSText.see("end")passpass

第五步,小结

说实话,我不太会写什么小结之类的,总之,这个小项目也就这样的完成了。如果大家有想要了解的地方,可以给我发邮件(1346677696@qq.com),或者站内私信我。

【Python】【Tkinter】png转ico小工具源码以及打包exe相关推荐

  1. Python实现多个excel文件合并源码及打包exe程序

    ##以下是源码filecombine.py,比较简单,有相应说明,也是结合别的代码自己修改的,用到的包需要提前装好. # -*- coding: utf-8 -*- import xlrd impor ...

  2. 计算机毕业设计Python+django 宠物领养中心小程序(源码+系统+mysql数据库+Lw文档)

    项目介绍 据世界动物保护协会统计,全世界大概有5亿只流浪狗和散养的狗和大致同样数量的流浪猫,而这些主要源于主人的弃养.同时,在很多地区,狗和猫都处于散养状态,这部分的动物,也经常会变成流浪动物.猫和狗 ...

  3. MFC自用小工具源码

    效果:快速打开计算机内常用的软件,功能,设置 // 自用小工具Dlg.cpp : 实现文件 // #include "stdafx.h" #include "自用小工具. ...

  4. 学生学python编程---实现贪吃蛇小游戏+源码

    学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...

  5. 视频批量去片头片尾小工具源码分享

    视频批量去片头片尾小工具源码分享(基于FFmpeg视频流复制切割,快速无损) 开发环境Delphi2010,框架VGScene(新版本用FMX) 特点:直观的预览界面,秒级的微调定位,批量预设.单个微 ...

  6. 2023 易语言 查看系统信息小工具源码

    使用精易模块,调用电脑自带的系统信息,一次性查询,做电脑店的可以拿去用,看配件很方便 2023 易语言 查看系统信息小工具源码

  7. 一起用python做个炫酷音乐播放器【V3.0含源码及打包exe】

    前言 熟悉的小伙伴都知道,前段时间写了一篇关于音乐播放器的文章–Python自制一款炫酷音乐播放器.不少小伙伴私信我,对播放器提了一些改进建议,对播放器的一些逻辑bug优化完善.今天音乐播放器3.0版 ...

  8. 小程序 祝福小工具源码分享

    2019.小程序的市场依旧是那么火爆...... 所在我在这里,想给大家分享一套关于送祝福的工具类的小程序源码.这不马上元旦.除夕夜等等一系列节日了,我们大家送给亲朋好友的祝福肯定是不能少的,那么我们 ...

  9. 120个微信小程序源码,打包下载

    从11月正式公测到今天,"小程序"上线时间一直成为外界关注的话题.昨天,腾讯高级副总裁.微信创始人张小龙在微信公开课上透露,"小程序"计划于1月9日正式上线,其 ...

最新文章

  1. c语言程序计算bmi指数,计算BMI的程序怎么写
  2. windows下mysql和linux下mysql主从配置
  3. 简明 Vim 练级攻略
  4. 没有统计学基础可以学python-如何系统地自学 Python?
  5. windows批量修改文件、文件夹名工具:Bulk Rename Utility批量改名演示
  6. CNCF TOC 委员张磊:不断演进的云原生给我们带来了什么?
  7. Hibernate 拦截器的使用--动态表名
  8. django基于大数据的应届生求职系统--python-计算机毕业设计
  9. MATLAB设置使用语言为中文
  10. java方面的文献综述怎么写_关于java的文献综述
  11. idea中加入git版本控制
  12. PyAlgoTrade框架研究
  13. linux教程第六章,第六章:依赖性 - scons用户指南_Linux教程_Linux公社-Linux系统门户网站...
  14. OpenBSD身份验证绕过和权限提升漏洞
  15. 接口管理工具Rap的安装
  16. 谷歌浏览器安装vue-devtools
  17. mysql启动失败原因排查
  18. OA系统,企业的专属协同办公平台
  19. 网页Javascript潜入HTML页面方法
  20. (基础很弱的人)如何学好英文

热门文章

  1. 面试测试开发工程师:Java测试基础篇
  2. 快30岁了,失业了怎么办?
  3. Vue-导航守卫——全局前置守卫
  4. 统计二叉树中只有右孩子的结点个数
  5. Linux系统管理员应该知道的journalctl知识
  6. 冬天肾囊肿病人应注意事项
  7. 爱奇艺在日志实时数据监控的探索与实践
  8. chrome字体发虚神马的
  9. 哈工大计算机学院嵌入式系统设计与实现-实验1~6 创龙tronlong
  10. 安装4.210版本Verilator