Python-简易音乐播放器制作

因为中的代码块比较难操作,所以大家既可看下方的源代码,也可点击知乎的链接,跳转后阅读!

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
【注】:可以转载,但需要注明出处,有什么问题,在评论区留言!我会继续努力,争取一直能够让大家白嫖下去!因为是多个平台的作者,每天都要花大把时间,若在各个平台相互转载链接也请见谅!

你可能感兴趣的:(Python-简易音乐播放器制作)