pyqt5 写一个功能齐全的音乐播放器(第二章)

第二章

鉴于第一章写了几个跟音乐播放器没有直接关系的控件之后,本来继续忽悠一下,但是这么忽悠的话,你们又不跳坑里面,我打算给一丢丢干货

数据库的crud

啊这啊这,搞数据库干嘛呢,其实是想做一个播放列表而已,目前搞的是最简单的sqlite3来做播放列表,会json的也可以用它,我只是之前写了个mysql的(人家就这么叫我写的意义不明)而已

创建sqlite3 连接

首先咱们import一个sqlite3

import sqlite3

(不用接着上一章的代码,因为最后会有些gui的小改动)然后创建一个连接池:

def sqlconn(self):
        # conn = pymysql.connect(host='localhost', port=3306, user='root', password="123456", db="tb1")
        try:
	        conn = sqlite3.connect('.\\admin.db')
	        return conn
	    except:
	    	self.timer1=QTimer()
            self.timer1.timeout.connect(lambda :self.status1(0))
            self.timer1.start(10)
	    	

self.status1 是一个利用qtimer的在状态栏显示通知的功能,为啥这样写呢,除了会使用time.sleep()类似想让通知顺序一个个跑出来之外,关键是qtimer是一个线程,你不会被其他的任务耽误,它会在适当的时候就显示出来,线程嘛,大家懂的

那每次使用就可以使用这个函数就可以创建连接了,嗯,之所以是干货是,curd在任何情况都不用怎么改就能用了,直接抄就完事

在retranslateUi的函数里面,写上启动时检查播放列表是否创建:

def testup(self):
try:
self.readdb()
except:
self.createdb()

读取数据库内容并显示到图形界面的表格上

首先咱有简单点的方法编辑数据库,介绍下sqlite3一个超级好用的软件
db broswer for sqlite
在这里插入图片描述
打开软件点击新建数据库
按数据库结构>创建表

在这里插入图片描述
嗯,没次新建表,就会有命令顺便生成出来,相当傻瓜

然后你点浏览数据
点一加号就可以增加一行
在这里插入图片描述
请添加图片描述

那就可以想编辑excel一样编辑它,记得最后要点"写入更改"就行了

来到python

import sqlite3
def sqlconn():
        # conn = pymysql.connect(host='localhost', port=3306, user='root', password="123456", db="tb1")
        conn = sqlite3.connect('.\\admin.db')
        return conn

这个就是连接池 ,在默认的情况下,sqlite是不需要用户密码的,mysql就一定要了

import sqlite3
def sqlconn():
        # conn = pymysql.connect(host='localhost', port=3306, user='root', password="123456", db="tb1")
        conn = sqlite3.connect('.\\admin.db')
        return conn

def read():
        conn = sqlconn()

        cur = conn.cursor()
        sql="select * from song"
        cur.execute(sql)
        data=cur.fetchall()
        print('row {len(data)}')
        print('column {len(data[0]})')
        y=0
        for i in data:
                x=0
        
                for j in i:
                        print(f'column{
     x},row{
     y},值:{
     j}')
                        x+=1
                y+=1
                        
                        
read()

经过select读出来是一个字典,每个字典的元素装着一个turple ,每个turple代表一行,turple里的元素就是一个单元里面的一个数据,在pyqt5的表格行是row,列是column…

有些别的就是行是column ,列是row…歪果人就好神奇

def readdb(self):
        try:
            conn = self.sqlconn1()

            cur = conn.cursor()
            
            sql="select * form song"
        
            cur.execute(sql)
        except:     
            self.createdb()
            print('ERROR')
        data=cur.fetchall()
        self.playlist.setColumnCount(7)
        self.playlist.setRowCount(len(data[0]))
        
        y=0
        for i in data:
            x=0
            for j in i:
                print(f'column{
     x},row{
     y},值:{
     j}')
                if y!=5:
                    self.playlist.setitem(x,y,QtWidgets.QTableWidgetItem(str(j)))
                    print(f"x,y:{
     x} {
     y}")
                    
            
                else:
                    self.coverplace(j)
                    #data[x][5]是cover的数据,里面就是存放的图片的blob,其实应该再tag里面找,这里只是测试
                x+=1
            y+=1

属性介绍:
tablewidget.setColumnCount(7)
tablewidget.setRowCount(len(data))
tablewidget.setitem(x,y,QtWidgets.QTableWidgetItem(i))
tablewidget.setitem(x,y,picture)

setcolumnCount 表格的列数,这里就是data的一个元素的元素代表一列,打死7就好,因为固定的
.setRowCount 行数,这里是data的元素的length未行

.setitem(x,y,QtWidgets.QTableWidgetItem(i))行,列,加入的数据,如果是string就是这个,它只接受字串,所以是别的东西需要转换

.setitem(x,y,QPixmap(picture)) 好比label 上加入图片一样,可以直接使用这个加图片

另外还有加背景色,样式等等等,之后会讲,边幅还是挺多的

插入音乐

def importfile(self):
        filex , check = QFileDialog.getOpenFileName(None, "QFileDialog.getOpenFileName()",
                                               "", "All Files (*);;CE路由器 文件 (*.txt);;Text Files (*.txt)")
        if check:
            self.timer1=QTimer()
            self.timer1.timeout.connect(lambda :self.status(7))
            self.timer1.start(1)
            
        
        from pathlib import Path
        path = Path(filex)
        filename=path.name
        # filenamewithout=path.stem
        self.insertdb(('歌手','专辑','timelength','cover','lyricpath',filename))
        #具体的导入功能会在之后写


def insertdb(self):
        conn = self.sqlconn1()

        cur = conn.cursor()
        sql = """insert into 'song' ("songname","name","album","timelength","lyricpath","cover","filepath") values (?,?,?,?,?,
                                                    ?,?)"""

        try:
      
            cur.execute(sql,i)
            conn.commit()
            self.timer1=QTimer()
            self.timer1.timeout.connect(lambda :self.status(1))
            self.timer1.start(1)
        except:
            self.timer1=QTimer()
            self.timer1.timeout.connect(lambda :self.status1(2))
            self.timer1.start(1)
            conn.rollback()
        self.readdb()
        

每次插入东西都要当场select一下,主要是重新更新列表,相当于刷新

def deldb(self):
        id=self.playlist.selectedItems()[0].text()
        file=self.playlist.selectedItems()[1].text()
        try:
        	
            # os.remove(file)#删除文件
            pass
        except:
            pass
        conn = self.sqlconn1()        
        cur = conn.cursor()
        

        sql = f"delete from 'song' where song={
     id}"

        cur.execute(sql)
        conn.commit()
        conn.close()
    
        self.readdb()

.selectedItems()[0].text()
这个你选取的那一行的第0个元素,那个就是id 的文字内容

所有有变动列表的功能,同样也要更新下列表

还有select …like 做搜索等等,就先不写了吧

更换背景

def picchange(self):
        directory=QFileDialog.getOpenFileName(self.pathedit,"Add Sound","","Sound Filed(*.jpg *.gif *.png)")        
        
        
        self.wallp.setPixmap(QPixmap(directory[0]))

QFileDialog.getOpenFileName 以文件名打开
.setPixmap(QPixmap(directory[0])) 更换背景 directory[0] 就是完整路径

这章好像没啥说的,回顾一下,就是tablewidget 怎么插入数据,数据库的curd,更换图片,嗯,我确实是想写一个花里胡哨的音乐播放器,之后还会有很多东西加入,

时间关系,代码没有一一核对,可能会有一丢丢错漏,请自行debug吧,我会在下一章再修复所有问题,并增加代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QTimer,QDateTime
import time

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLineEdit,QDialog,QFileDialog
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QLabel
from PyQt5.QtWidgets import QMessageBox, QMenu
import sqlite3


# from PyQt5 import QtCore, QtGui, QtWidgets,Qt
# from PyQt5.QtWidgets import QFileDialog,QListWidgetItem,QAbstractItemView,QGraphicsItem, QGraphicsPixmapItem,QGraphicsScene, QGraphicsView,QLabel,QTableWidgetItem,QApplication,QComboBox
# from PyQt5.QtCore import QTimer,QStringListModel,QSize,QObject,pyqtSignal,QThread,QUrl
from PyQt5.QtGui import QPixmap,QFont,QIcon
# from PyQt5.QtWebEngineWidgets import *
import os
import random,time
from pygame import mixer
from mutagen.mp3 import MP3
# import style
# import pymysql
# from netmusicsearch import *
import requests
# from dler import *
# from lyric import *
import music_tag

from datetime import timedelta



class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        F
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值