因为中的代码块比较难操作,所以大家既可看下方的源代码,也可点击知乎的链接,跳转后阅读!
Python-简易音乐播放器制作 - Lonelyroots的文章 - 知乎
https://zhuanlan.zhihu.com/p/393500129
该播放器需要使用到pycharm、MySQL8.0和navicat软件的使用。下方为播放器源代码!有什么不懂的欢迎在评论区留言!
'''play.py'''
from MyService import MyService
from tkinter.filedialog import askopenfilenames
import tkinter
class PlayWindow: #创建一个窗口类
def __init__(self,myService): #初始化myService,这里的myService即为底下不作为脚本直接执行的使用方法中传进的参数myservice
self.myService=myService #实例属性
def playMusic(self,even): # 为给按钮添加事件创建的方法
"""播放音乐的方法"""
print("点击了音乐播放按钮")
"""获取播放的音乐"""
index = self.listbox.curselection()
music_name = self.listbox.get(index)
"""调用播放方法进行播放音乐"""
self.myService.play_music(music_name)
def impMusic(self,even):
"""导入音乐的方法"""
print("点击了导入音乐按钮")
"""打开磁盘选择音乐""" # 导入模块askopenfilenames
files = askopenfilenames(filetype=(['mp3','*.mp3'],)) #打开磁盘后,只能选择的文件名后缀为一个或多个.mp3,得到结果files
"""导入音乐,将选择的音乐保存到数据库,调用MyService里的add_music方法"""
self.myService.add_music(files) #调用MyService类里的add_music方法,因为PlayWindow下myService里初始化了,
self.flush_list()
def deleteMusic(self,even):
"""删除音乐的方法"""
print("点击了删除音乐按钮")
'''获取删除音乐的名称'''
index = self.listbox.curselection() # curselection可以获取到删除的音乐下标
music_name = self.listbox.get(index) # 用get()方法根据下标获取音乐名
print(music_name)
'''调用删除音乐的方法'''
self.myService.delete_music(music_name)
'''刷新列表'''
self.flush_list()
def flush_list(self):
"""刷新当前用户音乐列表的方法"""
'''清空列表'''
self.listbox.delete(0,tkinter.END) #将第0个到最后一个全部清空
'''查询该用户的所有音乐列表'''
music_list = self.myService.findListByUser()
if music_list:
for m in music_list:
self.listbox.insert(tkinter.END,m) # listbox(插入的索引号,插入的字符串)先加入放于下方,后加入的放于上方
def showWindow(self):
"""展示窗口的方法"""
'''显示窗口'''
top = tkinter.Tk()
'''添加按钮'''
play_button=tkinter.Button(top,text='播放')
imp_button=tkinter.Button(top,text='导入音乐')
delete_button=tkinter.Button(top,text='删除')
'''布局按钮'''
play_button.grid(row=0,column=0,padx=5,pady=5) #将播放按钮放在第一行,第一列,padx按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离,pady按钮在y轴方向上的内边距(padding)
imp_button.grid(row=0,column=2,padx=5,pady=5)
delete_button.grid(row=0, column=4, padx=5, pady=5)
'''添加下方歌曲列表'''
self.listbox=tkinter.Listbox(top) #tkinter的组件listbox
self.listbox.grid(row=1,column=0,padx=5,pady=5,columnspan=6)
"""给按钮添加事件"""
play_button.bind("",self.playMusic)
imp_button.bind("",self.impMusic)
delete_button.bind("", self.deleteMusic)
'''添加音乐列表(一登录成功就有)'''
self.flush_list()
top.mainloop()
if __name__ == '__main__': #该处的文件
# 向控制台输入
uname = input("请输入用户名:")
password = input("请输入密码:")
myservice = MyService() #创建一个实例对象
if myservice.login(uname,password): #调用login登录方法,返回True,False
print("登录成功")
playwindow=PlayWindow(myservice) #创建一个实例对象,PlayWindow是类,把参数往里传,在PlayWindow里的构造函数方法中初始化,在该类里就可以使用
playwindow.showWindow() #调用PlayWindow里的showWindow方法
else:
print("登录失败")
'''MyService.py'''
from dbUtil import Mydb #导入dbUtil里的Mydb类
import pygame
class MyService: #创建一个类
def __init__(self):
self.user=None # 添加属性,一开始是None
def login(self,uname,password):
"""创建登录方法"""
sql = "select * from t_user where uname = %s and password = %s" # 查询t_user表里的uname和password
user = Mydb().query_one(sql,uname,password) #直接调用query_one()方法
if user: # 如果查询到user有值
self.user=user # 给user赋值
return True #返回True
else: # 若user没有值
return False #返回False
def add_music(self,files):
"""将音乐添加到数据库的方法"""
for f in files:
'''切片'''
start = f.rfind('/')+1
end = f.rfind('.mp3')
music_name = f[start:end]
'''根据歌名查询数据库是否有该首歌'''
sql = "select * from t_music where music_name=%s"
music = Mydb().query_one(sql,music_name) #调用dbUtil里的类方法query_one
if music: # 如果查询到有这首歌
''' 查询关联表t_list,该用户是否添加了这首歌 '''
sql = "select * from t_list where mid=%s and uid=%s"
t_list = Mydb().query_one(sql,music[0],self.user[0])
if not t_list:
sql = "insert into t_list(mid,uid) values(%s,%s)"
Mydb().exeDML(sql,music[0],self.user[0])
else:
'''将音乐名及其路径保存到t_music表'''
sql = "insert into t_music(music_name,path) values(%s,%s)"
mid = Mydb().exeDML(sql,music_name,f) #调用Mydb类中的exeDML方法,返回id 赋值给mid
'''用户选择的音乐保存到t_list表'''
sql = "insert into t_list(mid,uid) values(%s,%s)"
Mydb().exeDML(sql,mid,self.user[0]) # self.user有值的第一个字段即uid
def findListByUser(self):
"""查询用户的音乐列表的方法"""
sql = "select music_name from t_music m,t_list t where m.id=t.mid and t.uid=%s"
return Mydb().query_all(sql,self.user[0]) # 返回用户已添加的音乐名
def delete_music(self,music_name):
"""删除音乐名的方法"""
'''根据音乐名称查询音乐id'''
sql = "select id from t_music where music_name=%s"
mid = Mydb().query_one(sql,music_name)
'''删除关联表中的数据t_list'''
sql = "delete from t_list where uid=%s and mid=%s"
Mydb().exeDML(sql,self.user[0],mid[0])
def play_music(self,music_name):
"""播放音乐方法"""
'''根据音乐名称查询路径'''
sql = "select path from t_music where music_name=%s"
path = Mydb().query_one(sql,music_name)
pygame.mixer.init()
pygame.mixer.music.load(path[0]) # 进行音乐路径加载
pygame.mixer.music.play() # 音乐播放
'''dbUtil.py'''
import pymysql
class Mydb:
'''创建一个类属性(字典)'''
config = {
"host":"localhost","user":"root","password":"a3",
"db":"music_project",
"charset":"utf8"
}
def __init__(self):
self.connection = pymysql.connect(**Mydb.config)
self.cursor = self.connection.cursor()
def close(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
# 插入 修改 删除调用
def exeDML(self, sql, *args): # *args可变参数
try:
# 执行sql
count = self.cursor.execute(sql, args)
id = self.connection.insert_id()
# 提交事务
self.connection.commit()
return id
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close()
def query_one(self, sql, *args):
try:
# 执行sql
self.cursor.execute(sql, args)
# 获取结果集
return self.cursor.fetchone()
except Exception as e:
print(e)
finally:
self.close()
def query_all(self, sql, *args):
try:
# 执行sql
self.cursor.execute(sql, args)
# 获取结果集
return self.cursor.fetchall()
except Exception as e:
print(e)
finally:
self.close()
if __name__ == "__main__":
dbutil = Mydb()
'''MySQL运行代码'''
/* 创建数据库music_project */
create database music_project;
/* 创建t_user表 */
create table t_user(
id int not null primary key auto_increment,
uname varchar(20),
password varchar(20)
)
/* 创建t_music表 */
create table t_music(
id int not null primary key auto_increment,
music_name varchar(25),
path varchar(255)
)
/* 创建t_list表 */
create table t_list(
id int not null primary key auto_increment,
mid int,
uid int,
constraint fk_list_music_id foreign key(mid) references t_music(id), #添加外键约束
constraint fk_list_user_id foreign key(uid) references t_user(id) #添加外键约束
)
/* 插入数据 */
insert into t_user (id,uname,password) values(1,'ch',123),(2,'ls',123);
文章到这里就结束了!希望大家能多多支持!私聊我,可以问关于本文章的问题,包教包会!长时间未回,可以添加我的微信!以后每天都会发布新文章,喜欢的点点关注!其它官方平台喜欢的也可以点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去!美好生活是靠自己掌握的!一起加油!
@知乎:Lonelyroots
@CSDN:Lonelyroots°
@:Lonelyroots
@微博:二十三画追梦人
@微信号:Aurora-cbh
【注】:可以转载,但需要注明出处,有什么问题,在评论区留言!我会继续努力,争取一直能够让大家白嫖下去!因为是多个平台的作者,每天都要花大把时间,若在各个平台相互转载链接也请见谅!