基于python实现音乐播放器代码实例


Posted in Python onJuly 01, 2020

核心播放模块(pygame内核)

import time 
import pygame
import easygui as gui
 
file = r'D:\CloudMusic\G.E.M.邓紫棋,艾热 - 光年之外 (热爱版).mp3' #这里为音乐文件路径
pygame.mixer.init()
gui.msgbox("正在播放"+file)
track = pygame.mixer.music.load(file)
pygame.mixer.music.play()
time.sleep(240)
pygame.mixer.music.stop()

完整版源代码:

import os
import tkinter
import tkinter.filedialog
import time
import threading
import pygame #实现音频播放
 
#第一步:搭建界面
 
root = tkinter.Tk()
root.title('封亚飞的音乐播放器v1.0')
#设置窗口大小和屏幕绝对位置
root.geometry('460x600+500+100')
#固定窗口大小,设置窗口不可拉伸
root.resizable(False,False)
 
folder = ''	# 接收文件路径 默认为空
res=[]		# 
num=0
now_music = ''
 
 
#第二步:实现功能
 
def buttonChooseClick():
	#添加文件函数
 
	global folder
	global res
	#如果folder不为空,则····
	if not folder:
		folder = tkinter.filedialog.askdirectory() #选择目录,返回目录名
		musics = [folder + '\\' + music
				for music in os.listdir(folder)\
						\
				if music.endswith(('.mp3','.m4a','.wav','.ogg'))	]
 
 
		ret = []
		for i in musics:
			ret.append(i.split('\\')[1:])
			res.append(i.replace("\\",'/'))
 
		var2 = tkinter.StringVar()
		var2.set(ret)
		lb = tkinter.Listbox(root,listvariable=var2)
		lb.place(x=50,y=220,width=260,height=300)
 
	if not folder:
		return
	global playing
	playing = True
 
 
	#根据情况禁用或启用相应按钮
 
	bottonPlay['state'] = 'normal'
	bottonStop['state'] = 'normal'
 
	#buttonPause['state'] = 'normal'
 
	pause_resume.set('播放')
 
 
#播放音乐函数
def play():
	
	#初始化混响设备
 
	if len(res):
		pygame.mixer.init()
		global num
		while playing:
			if not pygame.mixer.music.get_busy():
				#随机播放
				nextMusci = res[num]
				print(nextMusci)
				print(num)
				pygame.mixer.music.load(nextMusci.encode())
				#播放一次
				pygame.mixer.music.play(1)
				#print(len(res)-1)
				if len(res) - 1 ==num:
					num=0
				else:
					num +=1
				nextMusci = nextMusci.split("\\")[1:]
				musicName.set('playing....'+''.join(nextMusci))
			else:
				time.sleep(0.1)
 
 
#点击播放函数
def bottonPlayClik():
	bottonNext['state']='normal'
	bottonPrev['state']='normal'
 
	#选择要播放的音乐文件夹
	if pause_resume.get() == '播放':
		pause_resume.set('暂停')
		global folder
 
		if not folder:
			#选择目录,返回目录名
			folder = tkinter.filedialog.askdirectory()
 
		if not folder:
			return
 
		global playing
 
		playing = True
 
		#创建一个进程来播放音乐,当前主进程用来接收用户操作
 
		t = threading.Thread(target=play)
 
		t.start()
 
	elif pause_resume.get() == '暂停':
 
		pygame.mixer.music.pause()
		pause_resume.set('继续')
 
	elif pause_resume.get()=='继续':
		pygame.mixer.music.unpause()
 
		pause_resume.set('暂停')
 
 
#停止播放函数
def bottonStopClik():
	global playing
 
	playing = False
 
	pygame.mixer.music.stop()
 
#下一首函数
def bottonNextClik():
	global playing
 
	playing = False
 
	pygame.mixer.music.stop()
 
	global num 
 
	if len(res) == num:
		num=0
	playing = True
	global t
	t = threading.Thread(target=play)
 
	t.start()
 
#上一首函数
def bottonPrevClik():
	global playing
 
	playing=False
 
	pygame.mixer.music.stop()
 
	global num
 
	if num==0:
		num=len(res)-2
 
	elif num ==len(res)-1:
		num-=2
	else:
		num-=2
	print(num)
 
	playing = True
	global t
	t.threading.Thread(target=play)
 
	t.start()
#关闭窗口函数
def closeWindows():
	global playing
	playing=False
	time.sleep(0.3)
 
	try:
		pygame.mixer.music.stop()
		pygame.mixer.quit()
 
	except:
		pass
	root.destroy()
 
 
#声音控制函数
def control_voice(value=0.5):
	pygame.mixer.music.set_volume(float(value))
 
 
 
 
#添加按钮
bottonChoose=tkinter.Button(root,text='添加',command=buttonChooseClick)
#按钮布局
bottonChoose.place(x=50,y=50,width=50,height=20)
 
#播放按钮	跟踪变量值的变化
pause_resume=tkinter.StringVar(root,value='播放')
bottonPlay=tkinter.Button(root,textvariable=pause_resume,command=bottonPlayClik)
#按钮布局
bottonPlay.place(x=120,y=50,width=50,height=20)
bottonPlay['state'] = 'disabled'	#未添加文件(刚启动)时禁用
 
#停止播放
bottonStop = tkinter.Button(root,text='停止')
#按钮布局
bottonStop.place(x=50,y=130,width=50,height=20)
 
#下一首
bottonNext = tkinter.Button(root,text='下一首',command=bottonNextClik)
#按钮布局
bottonNext.place(x=50,y=100,width=50,height=20)
bottonNext['state']='disabled'
 
#上一首
bottonPrev = tkinter.Button(root,text='上一首',command=bottonPrevClik)
#按钮布局
bottonPrev.place(x=120,y=100,width=50,height=20)
bottonPrev['state']='disabled'
 
#显示内容--播放状态
musicName = tkinter.StringVar(root,value='暂时没有播放音乐...')
labelName = tkinter.Label(root,textvariable=musicName)
labelName.place(x=10,y=20,width=260,height=20)
 
#显示内容--音量调节
s = tkinter.Scale(root,label='音量',from_=0,to=1,orient=tkinter.HORIZONTAL,length=240,
		showvalue=0,tickinterval=2,resolution=0.1,command=control_voice)
s.place(x=50,y=150,width=200)
 
#关闭窗口
root.protocol("WM_DELETE_WINDOW",closeWindows)
 
 
 
 
 
#启用消息循环:显示出上一步创建的画板对象
root.mainloop()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
Python print不能立即打印的解决方式
Feb 19 Python
python中wx模块的具体使用方法
May 15 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 #Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 #Python
.img/.hdr格式转.nii格式的操作
Jul 01 #Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 #Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 #Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 #Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 #Python
You might like
YB217、YB235、YB400浅听
2021/03/02 无线电
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
python中join()方法介绍
2018/10/11 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
sklearn+python:线性回归案例
2020/02/24 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
Born鞋子官网:Born Shoes
2017/04/06 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
应届生个人求职信模板
2013/11/26 职场文书
美化环境标语
2014/06/20 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
科学发展观演讲稿
2014/09/11 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB
Oracle使用别名的好处
2022/04/19 Oracle