Python 实现图片轮播及音乐循环播放
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/enland_lan/article/details/99939491
Python 实现图片轮播及音乐循环播放
使用说明
项目目录结构
生成 exe 文件
源代码
本项目实现的功能(简易的音乐电子相册):
每 5s 自动播放下一张图片
可以手动点击,播放下一张图片
循环播放 MP3 音乐文件
使用说明
需将文件夹 photo 和 music 以及最终执行的 album.exe 文件放到同一目录下,双击运行 album.exe 即可。
注意至少在 photo 文件夹下包含一张图片才能正常运行 album.exe
music 文件夹存放所要循环播放的 MP3 文件,如果不需要播放音乐,也可直接删除 music 文件夹
这里没有实现获取 photo 目录下的子目录的图片。主要考虑到照片太多的话,每次自动播放都从第一张图片开始,后面的图片可能需要很久才能播放,这可能不太友好
项目目录结构
(eln35) C:\Users\eln\PycharmProjects\Album>tree
文件夹 PATH 列表
卷序列号为 209A-F77C
C:.
│ album.exe # 最终生成的 exe 文件,从 dist 文件夹中复制出来
│ album.py # 源代码
│ README.html # 从 README.md 生成的网页
│ README.md # 说明文档
├─.idea # PyCharm 中新建项目时自动生成的文件夹,用于存放项目的配置信息。其中包括版本控制信息、历史记录等等
│ └─inspectionProfiles
├─build # 生成 exe 文件时自动生成的
│ └─album
├─dist # 生成 exe 文件时自动生成的,最终的生成 exe 文件保存在这里
├─music # 测试用的音乐文件(没有该路径也不影响运行)
│ Kalimba.mp3
│ Maid with the Flaxen Hair.mp3
│ Sleep Away.mp3
│
├─photo # 测试用的图片(必须包含一张图片)
│ Chrysanthemum.jpg
│ Desert.jpg
│ Hydrangeas.jpg
│ Jellyfish.jpg
│ Koala.jpg
│ Lighthouse.jpg
│ Penguins.jpg
│ Tulips.jpg
│
└─__pycache__ # python 运行的缓存文件夹,自动生成
生成 exe 文件
安装 python 的 pyinstaller 库:
(eln35) C:\Users\eln\PycharmProjects\Album>pip install pyinstaller
1
生成 exe 文件:
(eln35) C:\Users\eln\PycharmProjects\Album>rmdir /s /q dist
(eln35) C:\Users\eln\PycharmProjects\Album>rmdir /s /q build(eln35) C:\Users\eln\PycharmProjects\Album>pyinstaller -F -w album.py
-w 直接发布的 exe 应用带命令行调试窗口,在指令内加入 -w 命令可以屏蔽
-F 注意指令区分大小写。这里是大写。使用 -F 指令可以把应用打包成一个独立的 exe 文件,否则是一个带各种 dll 和依赖文件的文件夹
-p 这个指令后面可以增加 pyinstaller 搜索模块的路径。因为应用打包涉及的模块很多。这里可以自己添加路径。不过经过笔者测试, site-packages 目录下都是可以被识别的,不需要再手动添加
源代码
# -*- coding: utf-8 -*-"""
Created on 2019/8/20@author: eln@requirements: PyCharm 2017.2; Python 3.5.6 |Anaconda 4.1.1 (64-bit)@decription: 用 Python 制作一个电子相册
"""
# pip install pillow pygame mutagen
import os
import sys
import threading
import tkinter as tk
import time
from PIL import ImageTk, Image
import pygame
from mutagen.mp3 import MP3def playmusic():"""播放音乐。"""Path = r'music\\'try:list1 = os.listdir(Path) # 获取指定路径下所有的 mp3 文件for x in list1:if not (x.endswith('.mp3')):list1.remove(x)list2 = []for i in list1:s = os.path.join(Path, i) # 对路径与文件进行拼接list2.append(s)while True:for n in list2:# 获取每一首歌的时长path = naudio = MP3(n)pygame.mixer.init() # 初始化所有引入的模块pygame.mixer.music.load(path) # 载入音乐,音乐可以是 ogg、mp3 等格式pygame.mixer.music.play() # 播放载入的音乐time.sleep(int(audio.info.length)) # 获取每一首歌曲的时长,使程序存活的时长等于歌曲时长except Exception as e:print("Exception: %s" % e)resolution = (1366, 768) # 分辨率
Path = r'photo\\' # 相册路径
Interval = 5 # 播放间隔.单位:s
Index = 0 # 当前照片计数
title = "图片播放" # 窗口标题def getfiles():"""获取图片文件名。"""files = os.listdir(Path)for x in files:if not (x.endswith('.jpg') or x.endswith('.JPG') or x.endswith('.png')):files.remove(x)return filesfiles = getfiles()
print(files)
scaler = Image.ANTIALIAS # 设定 ANTIALIAS ,即抗锯齿
root = tk.Tk() # 创建窗口
root.title(title) # 设置窗口标题w, h = root.maxsize()
root.geometry("{}x{}".format(w, h)) #看好了,中间的是小写字母ximg_in = Image.open(Path + files[0]) # 加载第一张图片
# img_in = Image.open("load.jpg") # 加载第一张图片
w, h = img_in.size # 获取图片大小
size_new = (int(w * resolution[1] / h), resolution[1])
img_out = img_in.resize(size_new, scaler) # 重新设置大小
img = ImageTk.PhotoImage(img_out) # 用 PhotoImage 打开图片
panel = tk.Label(root, image=img) # Label 自适应图片大小
panel.pack(side="bottom", fill="both", expand="yes")def callback(e):"""手动切换图片。"""try:global Indexfor i, x in enumerate(files):# 判断文件是否存在if not os.path.isfile(Path + '%s' % x):breakif i != Index: # 跳过已播放的图片continueprint('手动处理图片', x, Index) # python 3.5# print(unicode('手动处理图片 %s %d' % (x, Index), "utf8", errors="ignore")) # python 2.7.15img_in = Image.open(Path + '%s' % x)print(img_in)w, h = img_in.sizesize_new = (int(w * resolution[1] / h), resolution[1])img_out = img_in.resize(size_new, scaler)img2 = ImageTk.PhotoImage(img_out)panel.configure(image=img2)panel.image = img2Index += 1if Index >= len(files):Index = 0breakexcept Exception as e:print("Exception: %s " % e)sys.exit(1)# root.bind("<Return>", callback)
root.bind("<Button-1>", callback) # 点击窗口切换下一张图片def image_change():"""自动切换图片。"""try:global Indextime.sleep(3)while True:for i, x in enumerate(files):# 判断文件是否存在if not os.path.isfile(Path + '%s' % x):breakif i != Index: # 跳过已播放的图片continueprint('自动处理图片', x, Index) # python 3.5# print(unicode('自动处理图片 %s %d' % (x, Index), "utf8", errors="ignore")) # python 2.7.15img_in = Image.open(Path + '%s' % x)w, h = img_in.sizesize_new = (int(w * resolution[1] / h), resolution[1])img_out = img_in.resize(size_new, scaler)img2 = ImageTk.PhotoImage(img_out)panel.configure(image=img2)panel.image = img2Index += 1if Index >= len(files):Index = 0time.sleep(Interval)except Exception as e:print("Exception: %s " % e)sys.exit(1)m = threading.Thread(target=playmusic) # 创建音乐播放线程
t = threading.Thread(target=image_change) # 创建图片切换线程
# python 可以通过 threading module 来创建新的线程,然而在创建线程的线程(父线程)关闭之后,相应的子线程可能却没有关闭
# 需要把 setDaemon 函数放在 start 函数前面解决此问题
m.setDaemon(True)
m.start() # 启动线程
t.start() # 启动线程root.mainloop() # 窗口循环
————————————————
版权声明:本文为CSDN博主「eln」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/enland_lan/article/details/99939491
Python 实现图片轮播及音乐循环播放相关推荐
- 多图片每隔2S循环播放
这算是自己的第一篇博文吧,记录下关于web的学习路程,虽然在别人眼里平淡无奇,不过我能力有限,一步步慢慢来-- 因为自己的疏忽与大意,急于把自己的代码精简,却没有去测试是否实现了代码原来的功能,造成之 ...
- MediaPlayer 之音乐循环播放器
先说以下开发环境:Android sdk 2.2 target:android-8 AndroidManifest.xml: Java代码 <?xml version="1.0 ...
- Flash:关键帧中调用自建的音乐类,进行播放、关闭、循环音乐+按键播放或者关闭外部音乐+循环播放背景音乐+播放按钮音乐+停止+加载外部音乐文件+AS2播放背景音乐
目录 一.关键帧里面:调用自建的音乐类, 循环播放外部音乐.进行播放.关闭.循环音乐 1.代码:自建音乐类 2.关键帧中创建.播放.暂停背景音乐+按钮音乐 3.文件布置 二.关键帧中:按键播放或者关闭 ...
- python +tkinter 打造网易云音乐下载播放器
先上图],本次爬取得是网易云音乐,因为接口很方便,还没试百度云音乐, 提供2种下载方式,单曲下载和url歌单链接批量下载,自动识别单曲或者是歌单链接,[正则表达式匹配] 由于搜索单曲,歌曲列表经过筛选 ...
- python实现游戏背景滚动(图片轮播)
目录 图片轮播 轮播效果 效果实现分析 游戏背景制作 背景效果 效果实现分析 一.python实现图片轮播 1.1 轮播效果 1.2 效果实现分析 1.2.1 pycharm导入pygame模块 开始 ...
- 原生Js_简易图片轮播模板
功能:图片自动循环轮播,通过点击"上一张","下一张"按钮来控制图片的切换 <!DOCTYPE html> <html><head ...
- Python OpenCV _1基本操作(画图,循环播放图像,鼠标事件,读取中文路径中的图片)
此系列源码在我的GitHub里:https://github.com/yeyujujishou19/Python-OpenCV 一,OpenCV的结构 A)根据功能和需求的不同,OpenCV中的函数接 ...
- html5图片无限循环播放,原生js实现无限循环轮播图效果
知识要点 1.实现无限循环的原理: 以偏移的距离来判断是否跳回第一张和最后一张 也可以利用循环判断图片的当前索引值 var newLeft=parseInt(list.style.left)+offs ...
- 使用JavaScript实现图片轮播,上一张后一张,循环播放
轮播图在前端页面中经常用到,包括PC端和移动端. 我所写的轮播图的方法是在页面中设计好一张图片的位置,并且加上按钮"上一张","下一张","循环播放& ...
最新文章
- Java 计算学生的平均成绩
- 华硕首款平板电脑周五开售
- c语言字符型计算器,求用c语言编程四则混合运算计算器?
- 丽水数据可视化设计价格_B端产品设计数据可视化图表选择篇
- MSSQL调优实战一 乱建聚集索引的后果
- 从头来之【iOS及历史版本特性介绍】
- MySQL 大表优化方案(长文)
- Android实现多条Toast快速显示(强制中止上一条Toast的显示)
- python约瑟夫环单向循环链表_用单向循环链表解决约瑟夫环(Joseph)问题
- Matlab晶闸管单相全桥电路仿真
- 闭环系统辨识matlab,系统辨识-12-闭环辨识
- 电商数据分析的4大思维和8类指标
- 【大数据公司研究】第三方大数据公司是如何赚钱的,以个推公司为例
- excel如何把顺序倒过来_excel表格怎么把字倒过来
- 办公小技巧:excel列宽在哪里设置
- Pytorch房价预测
- 流体力学-----连续性方程的推导和理解
- hdu4416——后缀自动机
- SkyWalking调研与初步实践
- seo每日一贴_?新手如何自学SEO,教程、书籍、工具推荐