生活随笔
收集整理的這篇文章主要介紹了
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 实现图片轮播及音乐循环播放的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。