sql
# 創建數據庫 CREATE DATABASE `music_player` CHARACTER SET 'utf8'; # 創建MP3音樂文件的表 CREATE TABLE mp3_file_list( id int PRIMARY KEY , mp3_name VARCHAR(200) NOT NULL UNIQUE, mp3_file VARCHAR(200) NOT NULL ); # 用戶信息表 CREATE TABLE mp3_user( id INT PRIMARY KEY , username VARCHAR(200) NOT NULL , password VARCHAR(200) NOT NULL ); # 用戶的播放列表 CREATE TABLE mp3_player_list( id INT PRIMARY KEY , uid INT, mid INT, CONSTRAINT f_mp3_user_id FOREIGN KEY (uid) REFERENCES mp3_user (id), CONSTRAINT f_mp3_file_list_id FOREIGN KEY (mid) REFERENCES mp3_file_list(id) );
mysql_util.py
# coding=utf-8 # Version:python3.6.1 __date__ = '2019/1/9 14:38' __author__ = 'Lgsp_Harold' import pymysql class MysqlHelper(object): config = { "host":"192.168.234.44", "user": "root", "password": "admin", "db": "music_player", "charset": "utf8" } def __init__(self): self.connection = None self.cursor = None # 從數據庫表中查詢一行數據 def getOne(self, sql, *args): try: self.connection = pymysql.connect(**MysqlHelper.config) self.cursor = self.connection.cursor() self.cursor.execute(sql, args) return self.cursor.fetchone() except Exception as ex: print(ex, ex) finally: self.close() # 從數據庫表中查詢多行數據 def getList(self, sql, *args): try: self.connection = pymysql.connect(**MysqlHelper.config) self.cursor = self.connection.cursor() self.cursor.execute(sql, args) return self.cursor.fetchall() except Exception as ex: print(ex, ex) finally: self.close() # 對數據庫進行增,刪,改 def executeDML(self, sql, *args): try: self.connection = pymysql.connect(**MysqlHelper.config) self.cursor = self.connection.cursor() num = self.cursor.execute(sql, args) # sql語句執行之后影響的行數 new_id = self.connection.insert_id() # 返回系統剛剛自動生成的id self.connection.commit() return new_id except Exception as ex: self.connection.rollback() print(ex, ex) finally: self.close() def close(self): if (self.cursor): self.cursor.close() if (self.connection): self.connection.close()
playservice.py
# coding=utf-8 # Version:python3.6.1 __date__ = '2019/1/9 14:31' __author__ = 'Lgsp_Harold' import pygame from mysql_util import MysqlHelper class Service(object): def __init__(self): self.helper = MysqlHelper() pygame.mixer.init() #登陸的業務 username 由用戶輸入。如果數據庫表中存在一條用戶數據,那么登陸成功。並且用戶數據保存到屬性中去。 def login(self,username,password): user = self.helper.getOne("select id,username,password from mp3_user WHERE username=%s and password=%s",username,password) if user: print("%s登陸成功"%user[1]) self.username = user[1] self.uid = user[0] return True else: print("你輸入的用戶名和密碼有誤") return False # 把mp3文件插入到表mp3中。注意:為了保證mp3的唯一性。需要在插入新mp3之前先查詢一下,是否已經存在。如果存在就不用插入 def load_mp3(self, files): # files 是用戶選中的音樂文件列表 if files: for f in files: end = f.find(".mp3") start = f.rfind("/") mp3_name = f[start+1:end] # 通過字符串截取獲得歌曲的名字 # print(mp3_name) # print(f) #為了保證mp3的唯一性。首先根據歌曲的名字去表中查詢。 mp3_id = self.helper.getOne("select id from mp3_file_list WHERE mp3_name=%s",mp3_name) if mp3_id and mp3_id[0] != 0: # 如果數據庫表中已經存在了,則不要插入;否則插入數據 print("%s已經在數據庫中存在",mp3_name) mp3_id = mp3_id[0] else: # 如果不存在,需要插入。並且返回插入之后,數據庫系統自動生成的ID mp3_id = self.helper.executeDML("insert into mp3_file_list (mp3_name,mp3_file) VALUE (%s,%s)", mp3_name, f) # 最后一步往用戶的播放列表中插入對應的指。 self.helper.executeDML("insert into mp3_player_list (mid,uid) VALUE (%s,%s)",mp3_id,self.uid) else: print("用戶沒有選擇文件") # 根據用戶登陸之后的ID,從數據庫中查到該用戶播放列表 def find_play_list_by_user(self): sql = "select t_m2.mp3_name from mp3_player_list as t_m1 join mp3_file_list as t_m2 on t_m1.mid = t_m2.id where t_m1.uid = %s" return self.helper.getList(sql,self.uid) # 播放MP3 def play_mp3(self,mp3_name): file_path = self.helper.getOne("select mp3_file from mp3_file_list WHERE mp3_name=%s",mp3_name) if file_path and file_path[0]: # 數據庫中找到了該mp3的路徑 pygame.mixer.music.load(r'%s'%file_path[0]) pygame.mixer.music.play() pygame.mixer.music.set_volume(0.1) # print(pygame.mixer.music.get_volume()) # 刪除MP3 def delete_play_list(self,mp3_name): mp3_id = self.helper.getOne("select id from mp3_file_list WHERE mp3_name=%s",mp3_name) if mp3_id: # mid = mp3_id[0] self.helper.executeDML("delete from mp3_player_list WHERE mid=%s and uid=%s",mp3_id[0],self.uid) # 暫停 def pause_mp3(self): pygame.mixer.music.pause() # 繼續播放 def unpause_mp3(self): pygame.mixer.music.unpause() # 停止 def stop_mp3(self): pygame.mixer.music.stop() # 設置音量 def setVolume(self): getVolume = pygame.mixer.music.get_volume() # print(getVolume) pygame.mixer.music.set_volume(getVolume + 0.01) # print(pygame.mixer.music.get_volume())
music.py
#coding:utf-8 from tkinter import * import tkinter.messagebox from tkinter.filedialog import askopenfilenames import pygame from playservice import Service #<Button-1>:鼠標左擊事件 #<Button-2>:鼠標中擊事件 #<Button-3>:鼠標右擊事件 #<ButtonRelease-x>:鼠標釋放事件,x=[1,2,3],分別表示鼠標的左中右鍵操作 #<Double-Button-1>:雙擊事件 class MainWindow: def play(self,event): # tkinter.messagebox.showinfo("messagebox","this is button 1 dialog") # filepath = askopenfilename(filetypes=(("MP3 file","*.mp3"),)) # print(filepath) # track = pygame.mixer.music.load(r'D:/ProgramFiles/Development/PycharmProjects/music_player/music.mp3') # print(track,type(track)) # pygame.mixer.music.play() num = self.tl.curselection() # 獲取用戶所選的MP3的下標 mp3_name = self.tl.get(num) # 根據下標返回mp3的名字 self.service.play_mp3(mp3_name) def delete_mp3(self,event): num = self.tl.curselection() # 獲取用戶所選的MP3的下標 mp3_name = self.tl.get(num) # 根據下標返回mp3的名字 self.service.delete_play_list(mp3_name) list = self.service.find_play_list_by_user() # print(list) self.tl.delete(0, END) for i in list: self.tl.insert(END, i[0]) def pause_mp3(self,event): self.service.pause_mp3() def unpause_mp3(self,event): self.service.unpause_mp3() def stop_mp3(self,event): self.service.stop_mp3() def setVolume(self,event): self.service.setVolume() # 當用戶在導入歌曲的按鈕上點擊調用的函數 def loadMp3(self,event): # tkinter.messagebox.showinfo("messagebox","this is button 4 dialog") files = askopenfilenames(filetypes=(("Mp3 file","*.mp3*"),)) self.service.load_mp3(files) list = self.service.find_play_list_by_user() # print(list) self.tl.delete(0,END) for i in list: self.tl.insert(END,i[0]) def select_text(self, event): # tkinter.messagebox.showinfo("messagebox", "this is") # item = self.tl.curselection() # print(self.tl.get(item)) pass def __init__(self): self.service=service self.frame = Tk() self.frame.title("Leslie的播放器") self.button1 = Button(self.frame, text="播放") self.button2 = Button(self.frame, text="暫停") self.button7 = Button(self.frame, text="繼續") self.button3 = Button(self.frame, text="停止") self.button4 = Button(self.frame, text="導入歌曲") self.button5 = Button(self.frame, text="刪除歌曲") self.button6 = Button(self.frame, text="增加音量") self.tl = Listbox(self.frame,{"selectmode":SINGLE}) # 播放列表 self.button1.grid(row=0, column=0, padx=5, pady=5) self.button2.grid(row=0, column=1, padx=5, pady=5) self.button3.grid(row=0, column=2, padx=5, pady=5) self.button7.grid(row=0, column=6, padx=5, pady=5) self.button4.grid(row=0, column=3, padx=5, pady=5) self.button5.grid(row=0, column=4, padx=5, pady=5) self.button6.grid(row=0, column=5, padx=5, pady=5) self.tl.grid(row=1, column=0, padx=5, pady=5, columnspan=6) # 返回該登陸用戶的播放列表 list = self.service.find_play_list_by_user() self.tl.delete(0, END) for i in list: self.tl.insert(END, i[0]) # 給list_box綁定鼠標事件 self.tl.bind("<ButtonRelease-1>",self.select_text) self.button1.bind("<ButtonRelease-1>", self.play) self.button5.bind("<ButtonRelease-1>", self.delete_mp3) self.button2.bind("<ButtonRelease-1>", self.pause_mp3) self.button7.bind("<ButtonRelease-1>", self.unpause_mp3) self.button4.bind("<ButtonRelease-1>", self.loadMp3) self.button3.bind("<ButtonRelease-1>", self.stop_mp3) self.button6.bind("<ButtonRelease-1>", self.setVolume) self.frame.mainloop() if __name__=="__main__": username = input("請輸入登陸的賬號:") password = input("請輸入登陸的密碼:") service = Service() if service.login(username,password): pygame.mixer.init() window = MainWindow()