https://blog.csdn.net/qq_41962782/article/details/80106158

小弟是小白因大作业,在此博文的基础上,我增加了歌曲目录的选择,自动播放,实时显示歌词名称并能实现自动切歌的功能,后续可能会增加一下实时显示动态歌词,歌曲下载等功能。于是写一篇博客记录一下。望大神指教!

自动播放的关键在于用多线程编程来跳出自动播放在GUI界面设计中死循环!
废话不多说,代码如下:
main_test.py

import tkinter
import os
from musicTree import TreeWindows
from lyric import Lyric
from musicButton import MusicButton
import sys, time
from tkinter.filedialog import askdirectorysys.path.append('/Users/wangrui/PycharmProjects/pythonProject/final homework/music')win = tkinter.Tk()
win.title("何猪音乐播放器")
win.geometry("950x700+300+100")# path = r"/Users/wangrui/Downloads/test"
path = askdirectory()
frameL = tkinter.Frame(win)
frameL.pack(fill=tkinter.Y, side=tkinter.LEFT)frameR = tkinter.Frame(win)
frameR.pack(fill=tkinter.Y, side=tkinter.RIGHT)treeWin = TreeWindows(frameL, path)
button = MusicButton(frameR, path)
win.mainloop()

目录选择的根本在于askdirectory函数。
musicButton.py

import tkinter
import threading
import os
import pygame
import random
import time
from mutagen.mp3 import MP3
# path = r"/Users/wangrui/Downloads/test"
num=0
class MusicButton(tkinter.Frame):def __init__(self, master, path):self.path = pathframe = tkinter.Frame(master)frame.pack(side=tkinter.TOP, fill=tkinter.X)self.label = tkinter.Label(frame)self.label.pack(fill=tkinter.X, side=tkinter.TOP)self.button1 = tkinter.Button(frame,text="上一曲",command=self.func1,width=10,height=4,bg="blue",fg="red",font=("华文琥珀", 10))self.button1.pack(side=tkinter.BOTTOM)self.button2 = tkinter.Button(frame,text="播放",command=self.func2,width=10,height=4,bg="blue",fg="red",font=("华文琥珀", 10))self.button2.pack(side=tkinter.BOTTOM)self.button3 = tkinter.Button(frame,text="暂停",command=self.func3,width=10,height=4,bg="blue",fg="red",font=("华文琥珀", 10))self.button3.pack(side=tkinter.BOTTOM)self.button4 = tkinter.Button(frame,text="下一曲",command=self.func4,width=10,height=4,bg="blue",fg="red",font=("华文琥珀", 10))self.button4.pack(side=tkinter.BOTTOM)self.button5 = tkinter.Button(frame,text="自动播放",command=self.func5,width=10,height=4,bg="blue",fg="red",font=("华文琥珀", 10))self.button5.pack(side=tkinter.BOTTOM)self.label = tkinter.Label(frame,text="HELLO 这里是 ARVIN 音乐播放器 ……",bg="light green",fg="blue")self.label.pack(fill=tkinter.X, side=tkinter.BOTTOM)self.label = tkinter.Label(frame,text="这里可以实时显示歌曲名称哦",bg="blue",fg="white",font=("华文琥珀", 20))self.label.pack(fill=tkinter.X)self.txt = tkinter.Text(frame,width=100,height=50,bg="light blue",fg="blue")self.txt.pack(side=tkinter.TOP, fill=tkinter.X)def file_name(self):for root, dirs, files in os.walk(self.path):return filesdef func1(self):global playingglobal numres=[]self.txt.delete(1.0,"end")file = self.file_name()for x in file:(filename1, extension) = os.path.splitext(x)if extension == '.mp3':res.append(os.path.join(self.path, x))palying = Falsepygame.mixer.music.stop()if num == 0:num = len(res) - 2elif num == len(res) - 1:num -= 2else:num -= 2playing = True# 必须创建一个线程来播放音乐,当前主线程来接收用户操作t = threading.Thread(target=self.play)# start执行线程t.start()def func2(self):# pygame.mixer.music.play()pygame.mixer.music.unpause()def func3(self):pygame.mixer.music.pause()def func4(self):global playingglobal numself.txt.delete(1.0,"end")res = []file = self.file_name()for x in file:(filename1, extension) = os.path.splitext(x)if extension == '.mp3':res.append(os.path.join(self.path, x))palying = Falsepygame.mixer.music.stop()if len(res) == num:num = 0playing = True# 必须创建一个线程来播放音乐,当前主线程来接收用户操作t = threading.Thread(target=self.play)# start执行线程t.start()def func5(self):global playingself.txt.delete(1.0,"end")playing = Truet = threading.Thread(target=self.cycle_play)t.start()def getPath(self,path1):pathList = os.path.split(path1)return pathList[-1]def play(self):# 播放音乐# 混音初始化,num给播放的歌创建idres = []file = self.file_name()for x in file:(filename1, extension) = os.path.splitext(x)if extension == '.mp3':res.append(os.path.join(self.path, x))if len(res):pygame.mixer.init()global numglobal playingwhile playing:if not pygame.mixer.music.get_busy():self.txt.delete(1.0, "end")# 随机播放一首歌曲nextMusic = res[num]pygame.mixer.music.load(nextMusic)audio = MP3(nextMusic)pygame.mixer.music.play()self.txt.insert(tkinter.INSERT, nextMusic)  # 测试代码if len(res) - 1 == num:num = 0else:num = num + 1playing =TruenextMusic = nextMusic.split('\\')[1:]# musicName.set('playing......' + ''.join(nextMusic))else:time.sleep(0.1)def cycle_play(self):global playingglobal filename1try:list1=[]# list1 = os.listdir(self.path)for x in os.listdir(self.path):# absPath = os.path.join(self.path, x)# text = self.getPath(absPath)(filename1, extension) = os.path.splitext(x)if extension == '.mp3':list1.append(x)list2 = []for i in list1:s = os.path.join(self.path, i)list2.append(s)a=0while a<len(list2):for n in list2:# 获取每一首歌的时长path = naudio = MP3(n)pygame.mixer.init()  # 初始化所有引入的模块# self.txt.delete(1.0, "end")    #testpygame.mixer.music.load(path)  #载入音乐pygame.mixer.music.play()  # 播放载入的音乐print(filename1)self.txt.insert(tkinter.INSERT, path) #测试代码time.sleep(int(audio.info.length))  # 获取每一首歌曲的时长,使程序存活的时长等于歌曲时长playing = Truet = threading.Thread(target=self.play)t.start()self.txt.delete(1.0, "end")a+=1except Exception as e:print("Exception: %s" % e)

其中cycle_play是自动播放函数,在fun5中使用多线程调用了这个函数,使得可以通过外部指令打破自动播放中的for死循环。
musicTree.py

import tkinter
from tkinter import ttk
import os
import time
import pygameclass TreeWindows(tkinter.Frame):def __init__(self, master, path):self.path = path              #define path to global variableframe = tkinter.Frame(master)          # father initializationframe.pack(side=tkinter.LEFT, fill=tkinter.Y)self.label = tkinter.Label(frame,                  #创建控件text="曲库",bg="blue",fg="white",font=("华文琥珀", 15))self.label.pack(fill=tkinter.X)self.tree = ttk.Treeview(frame)               #构建文件管理器self.tree.pack(fill=tkinter.Y, side=tkinter.LEFT)# text=os.path.splitext()      #将路径最后一级分离出来 windows不支持root = self.tree.insert("", "end", text=self.getPath(path), open=True, values=(path))# 加载所有树枝self.loadTree(root, path)# 添加滚动条self.sy = tkinter.Scrollbar(frame)self.sy.pack(side=tkinter.RIGHT, fill=tkinter.Y)self.sy.config(command=self.tree.yview)             #配置滚动条对应到文本框self.tree.config(yscrollcommand=self.sy.set)# 绑定事件self.tree.bind("<<TreeviewSelect>>", self.func)     #将函数func的调用以事件顺序绑定到这个小部件def func(self, event):self.v = event.widget.selection() #event.widget获取Treeview对象,调用selection获取选择对象名称for sv in self.v:file = self.tree.item(sv)["text"]absPath = os.path.join(self.path, file)pygame.mixer.init()# track = pygame.mixer.music.load(absPath)# pygame.mixer.music.play()if absPath != r"/Users/wangrui/Downloads/test":track = pygame.mixer.music.load(absPath)pygame.mixer.music.play()def loadTree(self, father, fatherPath):# 遍历所有目录for filename in os.listdir(fatherPath):absPath = os.path.join(fatherPath, filename)# 插入树枝treey = self.tree.insert(father, "end", text=self.getPath(absPath), values=(absPath))# 判断是否是目录if os.path.isdir(absPath):# 递归self.loadTree(treey, absPath)def getPath(self, path):pathList = os.path.split(path)return pathList[-1]

先对歌曲目录进行选择~~~~


然后GUI界面如下,有自动播放,上一曲,下一曲,播放,暂停功能。

我们播放一首歌试试~~点击自动播放按钮,音乐就开始播放啦,并且能实时显示歌曲名称和根目录~~

完结,撒花~~以后可能会增加一些歌词动态实时显示,图片作为背景插入循环显示,随机播放等等功能~~
小弟刚接触python,有什么写得有问题的地方,望大神指教。

python+tkinter+threading制作多线程简易音乐播放器(自动播放,上一曲,下一曲,播放,暂停,实时显示歌曲名并能自动切换歌曲的功能)相关推荐

  1. Python使用threading实现多线程

    Python使用threading实现多线程 Python中多任务的实现可以使用进程,也可以使用线程. 一.线程介绍 进程是操作系统分配程序执行资源的单位,而线程是进程的一个实体,是CPU调度和分配资 ...

  2. android连接蓝牙控制音乐播放器播放暂停/上一曲/下一曲,且断开蓝牙暂停音乐

    客户需求要蓝牙设备可以控制音乐播放器的暂停等操作,当时只做了蓝牙的权限配置,未对这些操作做处理. 1.配置清单文件 <serviceandroid:name=".PlayerServi ...

  3. android 播放器音量,Android应用实例之调节播放器音量——AudioManager的应用

    实现的功能:调节播放器音量. 实现的思路:1)用ProgressBar显示当前音量大小: 2)在Button单击事件中改变音量大小: 3)关键是用什么控制音量,百度了一下可以用AudioManager ...

  4. Android耳机线控-播放/暂停/上一曲/下一曲

    起因 前一阵子完成了用有线耳机控制Android手机App的音频播放,具体实现了用耳机线的按键完成播放.暂停.上一曲.下一曲的功能.在网上查阅了一些资料,但不是特别尽如人意,记得有一篇写的很不错的这方 ...

  5. 开发个好的RTMP播放器到底难在哪里?RTMP播放器对标和考察指标

    好多开发者提到,RTMP播放器,不知道有哪些对标和考察指标,以下大概聊聊我们的一点经验,感兴趣的,可以关注 github: 1. 低延迟:大多数RTMP的播放都面向直播场景,如果延迟过大,严重影响体验 ...

  6. Ubuntu安装播放器 或 Linux上比较好用强大、并且可以倍速播放的播放器SMplayer

    Ubuntu16.04安装播放器 或 Linux上比较好用强大.并且可以倍速播放的播放器SMplayer 文章目录: 1 SMplayer 1.1 SMplayer 播放器 1.2 SMplayer在 ...

  7. 用猿大师播放器在网页上同时播放20路以上海康威视高分辨率(1920*1080)摄像头RTSP视频流?

    问: 同时播放分辨率为1920*1080的高清分辨率的摄像头视频流,找了很长时间试过无数方法均不能满足,服务器转码方案卡顿非常严重,几乎不能播放.了解到猿大师可以用到本机的硬件解码和加速,播放高清视频 ...

  8. iphone html5 音频播放器,iPhone应用轻松使用AVAudioPlayer音频播放

    iPhone应用轻松使用AVAudioPlayer音频播放是本文要介绍的内容,iPhoneSDK中的AVFoundation框架包括的AVAudioPlayer是一个容易使用而且功能强大,基于Obje ...

  9. python制作一个网易音乐下载器

    你只需要在代码同级目录新建一个文件夹mp3即可.代码可复制粘贴. 第一次思路如下,该效果只能一次下载单个音乐: #coding=gbk """ 描述:传参id即可下载音乐 ...

最新文章

  1. ffmpeg编译 c++ 常量中有换行符
  2. 让Linux系统崩溃最快速的方法
  3. 你发这些什么目的_吸引女生冷知识:朋友圈发照片的“潜规则”,男生要懂
  4. java将数组中的数据修改,深度集成!
  5. ABP入门系列(21)——切换MySQL数据库
  6. 华为P50系列外观正式官宣:双圆形后置相机模组实锤
  7. java开发的windows程序工作机制_Windows程序运行原理及程序编写流程
  8. vue样式控制的方式
  9. Swift 06.Closures
  10. python 2 函数
  11. 有关C++11标准的一些粗浅认识
  12. CHIL-SQL-LEFT JOIN 关键字
  13. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱展开图过程详解...
  14. 平衡车 两轮平衡车扭扭车程序漂移车主板方案原理图pcb图程 两轮平衡车扭扭车程序体感车
  15. NPOI导出Excel自适应行高
  16. 为什么要制定项目计划?
  17. Laravel填充数据Seeder出现Target class [***] does not exist.
  18. 动态规划的一般解题思路-详解
  19. “景驰科技杯”2018年华南理工大学程序设计竞赛 C Youhane's Undergraduate Thesis (大模拟)
  20. python实验六到十二作业(待完善)

热门文章

  1. 超全MySQL题(104道、含MySQL新特性解法)由浅入深、笔试必备!(第四部分40-52)
  2. window7安装过后有多大?6.18G
  3. jquery UI 跟随学习笔记——拖拽(Draggable)
  4. 创建微服务架构的步骤_如何快速搭建一个微服务架构?
  5. 1383: 手机短号 (多实例)
  6. redis常用命令总结,一文足以(5种基本数据结构+bitmap+Geo+HyperLogLog+Streams)
  7. assigning the result of this type assertion to a variable could eliminate the followin assertion解决
  8. 某宝用户行为数据分析
  9. 【力扣刷题】121.买卖股票的最好时机(python)
  10. 李梦恬爸爸分享之第十周课程资源