前言
版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文首发链接:https://blog.csdn.net/weixin_72543266/article/details/131700944
在本文中,也刚好到假期了,为了处理假期出去玩的图片开始第二个Python实战项目实战开始学习和使用,希望能对像我一样的初学者有所帮助。
本项目为本人第二次编写的第一个exe文件,作为自己的学习笔记,如有可改进的地方,望各为大佬指正,感谢!
一、本次学习须知
(1)本项目相比第一个项目多了制作ui方面的模块,具有一定的python基础以及能正常使用库即可进行学习,当然本次也有关于如何进行python项目打包相关的教学,初学者也可进行阅读并学习。
(2)本项目分为代码块进行制作笔记与学习。
二、项目学习
1.导入库
解读:
import tkinter as tk
:导入tkinter
模块,并将其重命名为tk
,用于创建GUI界面。from tkinter import filedialog, messagebox
:从tkinter
模块中导入filedialog
和messagebox
,用于文件对话框和消息框。import os
:导入os
模块,用于操作文件和目录。import pygame.mixer
:导入pygame.mixer
模块,用于音频播放。from PIL import ImageTk, Image
:从PIL
模块中导入ImageTk
和Image
类,用于处理和显示图片。
2.对图片进行九宫格图片分组处理
解读:
def group_remaining_images(images, num_images):
:定义了一个名为group_remaining_images
的函数,它接受两个参数:images
表示图片列表,num_images
表示图片数量。groups = []
:创建一个空列表groups
,用于保存图片分组。while num_images >= 9:
:当剩余图片数量大于等于9时,执行循环。group = images[:9]
:从输入的图片列表中获取前9张图片作为一个分组。groups.append(group)
:将这个分组添加到分组列表groups
中。images = images[9:]
:从输入的图片列表中移除已经分组的9张图片。num_images -= 9
:更新剩余图片数量,减去已经分组的图片数量。if num_images > 0:
:如果剩余图片数量大于0,执行以下代码。group = images[:num_images]
:获取剩余的图片作为一个分组。groups.append(group)
:将这个分组添加到分组列表groups
中。return groups
:返回图片分组列表groups
。总结:
(1)使用一个循环来将图片分成多个分组,每个分组包含至多9张图片。
(2)最后将剩余的图片数量不满9张的部分作为一个分组。这个函数可以用于对图片进行分组操作。
3.文件选择:
解读 :
def select_folder(entry):
:定义了一个名为select_folder
的函数,它接受一个参数entry
,表示一个文本框。
folder_path = filedialog.askdirectory()
:弹出文件夹选择对话框,并获取用户所选文件夹的路径。
entry.delete(0, 'end')
:清空文本框中的内容,将其初始化为空。
entry.insert(0, folder_path)
:将所选文件夹路径插入到文本框中的第一个位置,即将路径显示在文本框中。
总结:
(1)通过文件对话框弹出文件夹选择对话框,用户在对话框中选择文件夹后,将文件夹路径显示在给定的文本框中。
(2)这个函数可以用于在GUI界面中实现选择文件夹的功能。
4.对图片进行组成九宫格图片处理:
解读:
def process_images(input_folder_entry, output_folder_entry1):
:定义了一个名为process_images
的函数,它接受两个参数input_folder_entry
和output_folder_entry1
,表示输入文件夹和输出文件夹的文本框。
input_folder = input_folder_entry.get()
:获取输入文件夹路径的文本框内容。
output_folder = output_folder_entry1.get()
:获取输出文件夹路径的文本框内容。
if not os.path.isdir(input_folder):
:判断输入的文件夹路径是否有效。
messagebox.showerror("错误", "输入文件夹路径无效.")
:如果输入文件夹路径无效,显示错误消息对话框,提示输入文件夹路径无效。
if not os.path.isdir(output_folder):
:判断输出的文件夹路径是否存在。
os.makedirs(output_folder)
:如果输出的文件夹路径不存在,尝试创建输出文件夹。
messagebox.showerror("错误", "无法创建输出文件夹.")
:如果无法创建输出文件夹,显示错误消息对话框,提示无法创建输出文件夹。
images = [filename for filename in os.listdir(input_folder) if filename.endswith('.jpg') or filename.endswith('.png')]
:列出输入文件夹中所有以.jpg
或.png
结尾的文件,并存储到一个列表中。
num_images = len(images)
:计算图像文件的数量,即列表中元素的数量。
if num_images == 0:
:判断图片文件的数量是否为0。
messagebox.showerror("错误", "输入文件夹中没有图片文件.")
:如果图片文件的数量为0,显示错误消息对话框,提示输入文件夹中没有图片文件。
groups = group_remaining_images(images, num_images)
:将图片文件分组。
for i, group in enumerate(groups):
:遍历每个图片组。
new_image = Image.new('RGB', (600, 600))
:创建一个新的RGB图片,大小为600x600。
for j, image in enumerate(group):
:遍历当前图片组中的每张图片。
image_path = os.path.join(input_folder, image)
:获取图片的完整路径。
img = Image.open(image_path)
:打开图片。
img = img.resize((200, 200))
:将图片调整为200x200大小。
col = j % 3
:计算图片在新图片中的列数。
row = j // 3
:计算图片在新图片中的行数。
new_image.paste(img, (col * 200, row * 200))
:将调整后的图片粘贴到新图片上。
output_image_path = os.path.join(output_folder, f"九宫格图片_{i}.jpg")
:构造输出图片的文件路径。
new_image.save(output_image_path)
:保存新图片。
messagebox.showinfo("完成", "图片处理完成.")
:显示信息消息对话框,提示图片处理完成。
总结:
(1)实现了对输入文件夹中的图片进行处理,根据九宫格的规则将图片生成新的九宫格图片,并保存到输出文件夹中。
(2)它还包括了错误处理和消息提示的功能。
5.对图片进行四宫格图片分组处理:
解读:
def group_remaining_images_4(images, num_images):
:定义了一个名为group_remaining_images_4
的函数,它接受两个参数:images
表示图片列表,num_images
表示图片数量。
groups = []
:创建一个空列表groups
,用于保存图片分组。
while num_images >= 4:
:当剩余图片数量大于等于4时,执行循环。
group = images[:4]
:从输入的图片列表中获取前4张图片作为一个分组。
groups.append(group)
:将这个分组添加到分组列表groups
中。
images = images[4:]
:从输入的图片列表中移除已经分组的4张图片。
num_images -= 4
:更新剩余图片数量,减去已经分组的图片数量。
if num_images > 0:
:如果剩余图片数量大于0,执行以下代码。
group = images[:num_images]
:获取剩余的图片作为一个分组。
groups.append(group)
:将这个分组添加到分组列表groups
中。
return groups
:返回图片分组列表groups
。
总结:
(1)使用一个循环来将图片分成多个分组,每个分组包含至多4张图片。
(2)最后将剩余的图片数量不满4张的部分作为一个分组。这个函数可以用于对图片进行分组操作。
6.对图片进行组成四宫格图片处理:
解读:
- 定义一个名为
process_images2
的函数,它接受两个参数input_folder_entry
和output_folder_entry2
。这个函数用于处理四宫格图片。- 通过
input_folder_entry.get()
方法获取输入文件夹路径。- 通过
output_folder_entry2.get()
方法获取输出文件夹路径。- 检查输入文件夹路径是否为一个有效的文件夹目录。
- 如果输入文件夹路径无效,使用
messagebox.showerror()
函数显示一个错误消息对话框,提示输入文件夹路径无效,并返回函数。- 检查输出文件夹路径是否为一个有效的文件夹目录。
- 如果输出文件夹路径无效,尝试使用
os.makedirs()
函数创建输出文件夹。- 如果创建输出文件夹发生错误,使用
messagebox.showerror()
函数显示一个错误消息对话框,提示无法创建输出文件夹,并返回函数。- 创建一个列表
images
,其中包含输入文件夹中所有以.jpg
或.png
结尾的图片文件名。- 获取列表
images
中的图片文件数量,赋值给变量num_images
。- 如果图片文件数量为0,使用
messagebox.showerror()
函数显示一个错误消息对话框,提示输入文件夹中没有图片文件,并返回函数。- 使用
group_remaining_images_4()
函数将图片文件分组,每组包含4个图片文件,返回一个列表groups
。- 使用
enumerate()
函数对列表groups
进行迭代,同时获取索引和每个分组。- 创建一个新的RGB模式的图片,大小为600x600,赋值给变量
new_image
。- 对于每个分组中的每个图片,依次执行以下操作:
- 构造图片的完整路径,使用
os.path.join()
函数将输入文件夹路径和图片文件名拼接起来。- 使用
Image.open()
函数打开图片文件,赋值给变量img
。- 将图片调整为300x300大小,使用
img.resize()
函数。- 根据图片在分组中的索引计算图片在新图片中的位置,使用取余运算符
%
和整除运算符//
。- 将调整大小后的图片粘贴到新图片的指定位置,使用
new_image.paste()
函数。16.构造输出图片文件的完整路径,使用
os.path.join()
函数将输出文件夹路径和文件名拼接起 来。17.将新图片保存到指定的输出文件夹中,使用
new_image.save()
函数。18.使用
messagebox.showinfo()
函数显示一个信息消息对话框,提示图片处理完成。总结:
目的是将输入文件夹中的图片处理成四宫格的形式,并保存到指定的输出文件夹中。
7.音乐部分 :
解读:
- 创建一个名为
music_list
的变量,并用一个包含音乐文件路径的列表进行初始化。这些路径表示存储在计算机上的音乐文件的位置。
- 创建一个名为
current_index
的变量,并将其初始化为 0。这个变量表示当前播放的音乐在列表中的索引。
- 定义一个名为
play_music()
的函数。
- 在
play_music()
函数内部,使用pygame.mixer.init()
初始化音乐模块。这将准备音乐播放所需的资源。
- 使用
pygame.mixer.music.load()
函数加载music_list
中当前索引位置对应的音乐文件。
- 使用
pygame.mixer.music.play()
函数循环播放音乐。
- 定义一个名为
change_music()
的函数。
- 在
change_music()
函数内部,使用pygame.mixer.music.stop()
函数停止当前正在播放的音乐。
- 根据当前索引计算下一个要播放的音乐文件的索引,并将结果保存在
current_index
变量中。使用取模操作符%
来实现循环切换。
- 使用
pygame.mixer.music.load()
函数加载music_list
中新的索引位置对应的音乐文件。
- 使用
pygame.mixer.music.play()
函数循环播放新的音乐。
- 定义一个名为
stop_music()
的函数。
- 在
stop_music()
函数内部,使用pygame.mixer.music.stop()
函数停止音乐播放。
总结:
(1)展示了一个简单的音乐播放器的实现。
music_list
列表存储了要播放的音乐文件的路径,current_index
变量跟踪当前播放的音乐文件的位置。
(2)play_music()
函数用于播放音乐,change_music()
函数用于切换音乐,stop_music()
函数用于停止音乐播放。使用 Pygame 库,可以加载和播放音乐文件,实现基本的音乐播放功能。
8.创建ui部分:
(1)主窗口ui部分:
解读:
- 定义一个名为
create_gui()
的函数,用于创建用户界面 (UI)
- 创建一个 Tkinter 窗口,使用
tk.Tk()
创建并赋值给root
变量
- 定义窗口的宽度和高度,并将其赋值给
window_width
和window_height
变量
- 使用
root.geometry()
方法设置窗口的宽度和高度。将窗口宽度和高度作为参数传递给该方法
- 使用
root.title()
方法设置窗口的标题,其中标题作为参数传递给该方法
- 加载背景图片,使用
Image.open()
打开背景图片文件,并将其赋值给bg_image
变量
- 使用
bg_image.resize()
方法调整背景图片的大小,将宽度和高度调整为窗口的宽度和高度,并重新赋值给bg_image
变量
- 使用
ImageTk.PhotoImage()
方法将背景图片转换为可用于 Tkinter 的格式,并将其赋值给bg_image
变量
- 创建一个标签对象,使用
tk.Label()
创建并赋值给background_label
变量。此标签将用于显示背景图片
- 使用
background_label.place()
方法将标签放置在窗口上,覆盖整个窗口。x
和y
参数设置标签的位置,relwidth
和relheight
参数设置标签的大小,相对于窗口的宽度和高度的比例
总结:
(1)展示了一个创建用户界面的函数。使用 Tkinter 库,创建了一个窗口,并设置了窗口的标题、大小。
(2)通过加载背景图片并将其转换为可用于 Tkinter 的格式,创建了一个用于显示背景图片的标签,并将其放置在窗口上。这样就创建了一个具有背景图片的界面。
(2)文件夹ui部分:
解读:
- 创建一个文本标签(input_folder_label),用于显示文本内容"单图片文件夹路径:"。
- 将文本标签(input_folder_label)添加到窗口(root)上,并自动调整位置。
- 创建一个文本输入框(input_folder_entry),用于输入单图片文件夹路径。
- 将文本输入框(input_folder_entry)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(input_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将input_folder_entry作为参数传递。
- 将按钮(input_folder_button)添加到窗口(root)上,并自动调整位置。
- 创建一个文本标签(output_folder_label),用于显示文本内容"保存九宫格文件夹路径:"。
- 将文本标签(output_folder_label)添加到窗口(root)上,并自动调整位置。
- 创建一个文本输入框(output_folder_entry1),用于输入保存九宫格文件夹路径。
- 将文本输入框(output_folder_entry1)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(output_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将output_folder_entry1作为参数传递。
- 将按钮(output_folder_button)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(process_button),显示文本内容"九宫格图片处理",并在点击后调用process_images函数,将input_folder_entry和output_folder_entry1作为参数传递。
- 将按钮(process_button)添加到窗口(root)上,并自动调整位置。
- 创建一个文本标签(output_folder_label),用于显示文本内容"保存四宫格文件夹路径:"。
- 将文本标签(output_folder_label)添加到窗口(root)上,并自动调整位置。
- 创建一个文本输入框(output_folder_entry2),用于输入保存四宫格文件夹路径。
- 将文本输入框(output_folder_entry2)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(output_folder_button),显示文本内容"选择文件夹",并在点击后调用select_folder函数,将output_folder_entry2作为参数传递。
- 将按钮(output_folder_button)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(process_button),显示文本内容"四宫格图片处理",并在点击后调用process_images2函数,将input_folder_entry和output_folder_entry2作为参数传递。
- 将按钮(process_button)添加到窗口(root)上,并自动调整位置。
总结:
(1)实现了一个简单的UI界面,用于选择文件夹并进行九宫格图片处理和四宫格图片处理。
(2)第一段代码创建了用于输入单图片文件夹路径和保存九宫格文件夹路径的文本框和按钮,并定义了处理函数process_images。
(3)添加了用于保存四宫格文件夹路径的文本框和对应的处理函数process_images2。
(4)可以选择不同的文件夹路径,并通过点击按钮进行不同类型的图片处理操作。
(3) 音乐ui部分:
解读:
- 创建一个按钮(play_button),显示文本内容"播放音乐",并在点击后调用play_music函数。
- 将按钮(play_button)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(change_button),显示文本内容"切换音乐",并在点击后调用change_music函数。
- 将按钮(change_button)添加到窗口(root)上,并自动调整位置。
- 创建一个按钮(stop_button),显示文本内容"停止音乐",并在点击后调用stop_music函数。
- 将按钮(stop_button)添加到窗口(root)上,并自动调整位置。
- 进入主循环,等待用户操作。
- 如果该脚本作为主程序运行,调用create_gui函数创建UI界面。
总结:
(1)实现了一个简单的音乐播放的UI界面。通过创建播放音乐、切换音乐和停止音乐的按钮,并分别绑定相应的函数来实现对音乐播放的操作。
(2)可以点击按钮来控制音乐的播放、切换和停止。
9. 项目打包为exe文件:
一般打包流程(出现打包后运行缺少模块请移步特殊打包):
- 确保安装了pyinstaller模块:
- 在命令行中执行以下命令来安装pyinstaller:
pip install pyinstaller
- 进入项目所在的目录:
- 在命令行中使用
cd
命令进入您的项目根目录。
- 执行打包命令:
- 在命令行中执行以下命令来打包您的Python脚本为可执行文件:
pyinstaller --onefile your_script_name.py
- 替换
your_script_name.py
为您的Python脚本的文件名。
- 等待打包完成:
- 打包过程可能会花费一些时间,具体时间取决于您的项目规模和所使用的模块数量。
- 查找生成的可执行文件:
- 打包完成后,在同一目录中会生成一个名为
dist
的文件夹。 - 在
dist
文件夹中,会有一个与您的Python脚本同名的可执行文件,带有.exe
的扩展名。
特殊打包流程:
- 指定输出目录:
pyinstaller --onefile --distpath=output your_script_name.py
- 这将会将打包生成的可执行文件放置在指定的
output
目录中。
- 包含其他文件或目录(出现运行后缺少某个模块,需要找到缺少包的路径,注意路径后面要有分号包名 )(具体按照示例模仿进行):
pyinstaller -F -w -i 1.ico --add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame" picture.py
-F
:指定打包方式为单个可执行文件(Frozen)。-w
:指定以窗口模式运行,即无终端命令窗口,直接运行图形界面应用程序。-i 1.ico
:指定应用程序图标,将1.ico
替换为您自己的图标文件路径。--add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame"
:指定要包含的额外文件或目录。这里将Pygame库的路径与别名pygame
一起添加到打包文件中。- 如果需要额外加入多个内容比如将音乐一起打包可以使用
- pyinstaller -F -w -i 1.ico --add-data "D:\\python库学习\\Lib\\site-packages\\pygame;pygame" --add-data "C:\\Users\\86199\\Desktop\\图片处理工具\\music/*.mp3;music" 图片工具.py
- 多个--add-data 加路径和包名模仿上面一个代码进行。
picture.py
:指定要打包的Python脚本文件。- 引入额外的模块:
pyinstaller --onefile --hidden-import your_module your_script_name.py
- 使用
--hidden-import
参数来明确指定需要引入的额外模块。
- 设置可执行文件的图标:
pyinstaller --onefile --icon=your_icon.ico your_script_name.py
- 将
your_icon.ico
替换为自定义的图标文件路径,以使生成的可执行文件具有指定的图标。
10.具体实行内容:
运行界面:
运行前单图片:
四宫格处理:
九宫格处理:
三,总结:
通过九个不同的模块共同构成了这个项目:
1.导入库
2.对图片进行九宫格图片分组处理
3.文件选择
4.对图片进行组成九宫格图片处理
5.对图片进行四宫格图片分组处理
6.对图片进行组成四宫格图片处理
7.音乐部分
8.创建ui部分
9. 项目打包为exe文件
以上就是项目的所有内容,介绍了项目代码学习的每一个模块,python库是我们学习和使用的一种便利工具需要多加学习。