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()

Python3——MP3播放器的更多相关文章

  1. 从零开始学习PYTHON3讲义(十四)写一个mp3播放器

    <从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...

  2. MP3播放器团队项目

    一.设计思路 程序要求能播放MP3文件,因此需调用库中的播放方法:右键工具箱选择项,添加com组件,选择window media player后工具箱就会多一个控件,然后拖到窗体中就OK了.另在窗体中 ...

  3. 你也可以用java的swing可以做出这么炫的mp3播放器_源码下载

    I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this M ...

  4. 你用java的swing可以做出这么炫的mp3播放器吗?

    这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...

  5. MP3播放器的实现

    今天,基本上实现了MP3播放器的基本功能,现在总结一下. 首先,下载服务器端的MP3列表,这里用到了下载技术和解析XML文件技术. 下载参考(http://blog.csdn.net/huim_lin ...

  6. 安卓MP3播放器开发实例(1)之音乐列表界面

    学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...

  7. 开源mp3播放器--madplay 编译和移植 简记

    madplay是一款开源的mp3播放器. http://madplay.sourcearchive.com/ 下面简单记录一下madplay的编译与移植到ARM开发板上的过程 一.编译x86版本的ma ...

  8. 基于Stm32的MP3播放器设计与实现

    原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...

  9. x宝23大洋包邮的老式大朝华MP3播放器简单评测

    (纯兴趣测评,非广告) 最近逛X宝,看到了这个古董级MP3播放器居然还在售,于是脑抽+情怀泛滥买了一个. 然后呢,从遥远的深圳跨越好几千公里邮过来了这个玩意: 那节南孚5号电池是我自己的,是为了对比一 ...

随机推荐

  1. Flask 构建微电影视频网站(六)

    会员模块实现 会员注册 class RegistForm(FlaskForm): name = StringField( label="昵称", validators=[ Data ...

  2. DRF 商城项目 - 购物( 购物车, 订单, 支付 )逻辑梳理

    购物车 购物车模型 购物车中的数据不应该重复. 即对相同商品的增加应该是对购买数量的处理而不是增加一条记录 因此对此进行联合唯一索引, 但是也因此存在一些问题 class ShoppingCart(m ...

  3. mybatis 插入 含有美元符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 2 的问题

    一:问题描述: 在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密码后,带有$符号,导致新增用户的时候插入不了,报(IndexOutOfB ...

  4. SAM求多个串的最长公共子串

    又学到一个\(SAM\)的新套路QvQ 思路 考虑用其中的一个串建个\(SAM\),然后用其他的串在上面匹配,匹配时更新答案 首先有一个全局变量\(len\),表示当前已匹配的长度.假设目前在点\(u ...

  5. C++: 类成员初始化列表语法

      类的成员初始化列表的初始化的基本语法,类的构造函数还可以运用此语法为其变量初始化: class Class { private: int a; int b; char ch; public: Cl ...

  6. 开源顶级持久层框架——mybatis(ibatis)——day02

    mybatis第二天    高级映射 查询缓存 和spring整合          课程复习:         mybatis是什么?         mybatis是一个持久层框架,mybatis ...

  7. [Reinforcement Learning] Cross-entropy Method

    Cross-entropy Method(简称CEM)虽然是一种基于交叉熵的算法,但并不是我们熟知的监督学习中的交叉熵方法,与其说它是一种基于交叉熵的算法,倒不如说是一种基于蒙特卡洛和进化策略的算法. ...

  8. TERADATA SQL学习随笔<一>

    此博客内容简介及目录 http://www.cnblogs.com/weibaar/p/6644261.html 最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目 ...

  9. HDU-1028 Ignatius and the Princess III(生成函数)

    题意 给出$n$,问用$1$到$n$的数字问能构成$n$的方案数 思路 生成函数基础题,$x^{n}$的系数即答案. 代码 #include <bits/stdc++.h> #define ...

  10. Centos 上部署 tomcat7

     在 Centos 上部署 tomcat7 搜索tomcat,选下面红色框框的官网 选箭头指着的版本7, 选 tar.gz 格式, 下载完压缩包,使用 ftpx 工具,放在 centos 的 /opt ...