<Python>PyQt5自己编写一个音乐播放器(优化版)

2023-05-16

Python音乐播放器

更新日志:
20221031:添加独立播放列表
20221107:添加“上一首”、“下一首”功能

展示图片:
202211071308更新:添加上一首、下一首功能
在这里插入图片描述

20221031更新:添加独立播放列表
在这里插入图片描述

主要功能:
1、进度条拖动
2、音量拖动
3、独立播放列表
4、窗体渐变色(UI美化方面)

概述:
之前刚学python的时候,就照着网上的代码实现一个简单的播放器功能:
使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))
不过,这个博文里的程序功能比较简单,然后界面也没有设置:
初版界面:
在这里插入图片描述
20221031更新界面:
在这里插入图片描述
对比一下,外观上差别还是挺明显的。UI的配色可以根据自己的喜好来设置(QSS文件里设置)

本文主要说一下两个方面的实现:
1、独立播放列表
2、界面样式设置

其他功能设置就不多介绍,可以去看我之前写的那篇博文,我在底下也会把完整代码重新贴一遍。

独立播放列表的实现,主要在于多窗口之间的函数调用和参数传递实现,这个我也单独写过一个介绍:
<Python>PyQt5,多窗口之间参数传递和函数调用

有兴趣的可以看看。

播放列表窗口代码:

class music_list_win(QWidget):
    """歌曲列表窗口"""
    def __init__(self,m_l):
        super().__init__()
        self.music_list1=m_l
        #print(self.music_list1)
        self.initUI()
    def initUI(self):
               
        self.qss_style_file='music_play_pro2022\qss_music_list_win.qss'
        self.qss1=QssRead.readQSS(self.qss_style_file)      
               
        self.song_lists=[]
        
        self.list_music_list=QListWidget(self)
        self.list_music_list.doubleClicked.connect(self.music_list_doubleplay_func)
        #self.qlist.setStyle(QStyleFactory.create('Fusion'))
        self.list_music_list.setGeometry(10, 10, 230, 500)
        
        self.music_list_add()
        
        self.setGeometry(920, 100, 250, 600)
        self.setWindowTitle('播放列表')
        self.setStyleSheet(self.qss1)
        #self.setWindowFlag(Qt.FramelessWindowHint)
        self.setWindowIcon(QIcon("music_play_pro2022\musicicon2.jpeg"))
        #self.show()

列表填充函数:

    def music_list_add(self):
        
        for i,l in enumerate( self.music_list1):
            #print(l[0])
            self.list_music_list.addItem("[ "+str(i)+" ]"+"--"+l[0])

调用主窗体函数的函数:
这里mp1是主窗体的实例化,doubleplay_subwin()是主窗体的一个函数。

    def music_list_doubleplay_func(self):
        """"""
        #music_list_index=self.list_music_list.currentRow()

        mp1.doubleplay_subwin()
        

主窗体传递参数给播放列表窗体:
主窗体获取歌曲列表,并且同时将列表传递给子窗体(播放列表窗体),并且显示窗体。

  def load_music_file_func(self):
        #获取歌曲所在文件夹路径
        self.qlist.clear()
        self.cur_path=QFileDialog.getExistingDirectory(self, "选取文件夹", 'E:/')
        #判断歌曲文件路径是否存在
        if os.path.exists(self.cur_path):
            #将文件夹中的所有歌曲添加到List中
            for song in os.listdir(self.cur_path):
                #print(song)
                self.songs_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
                music_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
                self.qlist.addItem(song)
            self.music_list_win1=music_list_win(music_list)
            self.music_list_win1.show()

在这里插入图片描述
可以看到优化过的界面,背景色为渐变,看起来也好看一些,这里在qss文件里设置:

QWidget
{
    background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #81F5D8,stop:0.2 #43ABE7,stop:0.5 #57E7EC stop:1 #8EF068);
}

qlineargradient是设置渐变色的,可以调整渐变方向、渐变点、渐变颜色等,以调出自己喜欢的配色。

完整代码:
20221031更新:添加独立播放列表
20221107更新:添加上一首、下一首功能

#-*-coding:utf-8-*
"""名称:风尘音乐播放器
   版本:V0.1
   作者:菌尘
"""
import os
import string
import sys
import time
import random
import configparser
import ffmpeg
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from qss_read import QssRead

music_name=''
music_list=[]
music_list_index=0

class music_list_win(QWidget):
    """歌曲列表窗口"""
    def __init__(self,m_l:list):
        super().__init__()
        self.music_list1=m_l
        #print(self.music_list1)
        self.initUI()
    def initUI(self):
               
        self.qss_style_file='music_play_pro2022\qss_music_list_win.qss'
        self.qss1=QssRead.readQSS(self.qss_style_file)      
               
        self.song_lists=[]
        
        self.list_music_list=QListWidget(self)
        self.list_music_list.doubleClicked.connect(self.music_list_doubleplay_func)
        #self.qlist.setStyle(QStyleFactory.create('Fusion'))
        self.list_music_list.setGeometry(10, 10, 230, 500)
        
        self.music_list_add()
        
        self.setGeometry(920, 100, 250, 600)
        self.setWindowTitle('播放列表')
        self.setStyleSheet(self.qss1)
        #self.setWindowFlag(Qt.FramelessWindowHint)
        self.setWindowIcon(QIcon("music_play_pro2022\musicicon2.jpeg"))
        #self.show()
        
    def music_list_add(self):
        
        for i,l in enumerate( self.music_list1):
            #print(l[0])
            self.list_music_list.addItem("[ "+str(i)+" ]"+"--"+l[0])
        
        
    def music_list_doubleplay_func(self):
        """"""
        #music_list_index=self.list_music_list.currentRow()

        mp1.doubleplay_subwin()
        
        
class Music_Play_win(QMainWindow):
    """Main窗口"""
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        #导入UI样式文件
        self.qss_style_file='music_play_pro2022\qss_music_main_win_style.qss'
        self.qss1=QssRead.readQSS(self.qss_style_file)
        
        self.songs_list=[]
        
        self.music_list_win1=music_list_win(music_list)

        self.is_playing=False
        self.is_pause=True

        self.layout=QVBoxLayout()
        
         #添加菜单项
        self.menu1=self.menuBar()
        self.menu1.setGeometry(QRect(0,0,100,40))
        self.menu1.setObjectName("menubar")
           
        self.file=self.menu1.addMenu('文件')
        self.file_close_win=QAction('退出',self)
        self.file.addAction(self.file_close_win)
        
        self.tool=self.menu1.addMenu('工具')
        self.tool_change_bg=QAction('更改背景色',self)
        self.tool.addAction(self.tool_change_bg)
        
        self.about=self.menu1.addMenu('关于')

        #为菜单添加响应
        self.file_close_win.triggered.connect(self.close)
        self.tool_change_bg.triggered.connect(self.tool_change_bg_func)

        #UI布局
        self.gb1=QGroupBox('正在播放', self)
        self.gb1.setGeometry(220, 50, 420, 60)

        self.gb2=QGroupBox('个人中心', self)
        self.gb2.setGeometry(20, 40, 80, 300)

        self.gb3=QGroupBox('歌曲列表', self)
        self.gb3.setGeometry(220, 180, 300, 130)

        self.h1_layout=QHBoxLayout()
        self.h2_layout=QHBoxLayout()

        self.myfont = QFont('Microsoft YaHei',  20)

        self.my_btn=QPushButton('我的主页', self)
        self.my_btn.setStyle(QStyleFactory.create('Fusion'))
        self.my_btn.setGeometry(30,90,60,20)

        self.fav_btn=QPushButton('收藏页',self)
        self.fav_btn.setStyle(QStyleFactory.create('Fusion'))
        self.fav_btn.setGeometry(30, 120, 60, 20)
        
        self.btn_music_list=QPushButton('播放列表',self)
        self.btn_music_list.setGeometry(30,150,60,20)
        self.btn_music_list.setStyle(QStyleFactory.create('Fusion'))
        self.btn_music_list.clicked.connect(self.music_list_show_func)

        self.lbl_musicname=QLabel('', self)
        self.lbl_musicname.setGeometry(230, 65, 20, 20)
        self.lbl_musicname.adjustSize()

        self.label_song_duration_runtime = QLabel('00:00', self)
        self.label_song_duration_runtime.setStyle(QStyleFactory.create('Fusion'))
        self.label_song_duration_runtime.setGeometry(170, 60, 60, 20)
        #self.label1.adjustSize()

        self.label_song_duration_all = QLabel('00:00', self)
        self.label_song_duration_all.setStyle(QStyleFactory.create('Fusion'))
        self.label_song_duration_all.setGeometry(645, 60, 60, 20)
        #self.label2.adjustSize()

        self.lbl_vol_name=QLabel('音量',self)
        self.lbl_vol_name.setStyle(QStyleFactory.create('Fusion'))
        self.lbl_vol_name.setGeometry(220,120,20,20)
        self.lbl_vol_name.adjustSize()

        self.lbl_volunm=QLabel('0',self)
        self.lbl_volunm.setGeometry(355,125,20,20)
        self.lbl_volunm.adjustSize()

        self.player=QMediaPlayer()
        self.player.setVolume(3)
        self.player.stateChanged.connect(self.do_mediaplayer_statechanged)

        self.posi_fwd_btn=QPushButton('快进', self)
        self.posi_fwd_btn.setStyle(QStyleFactory.create('Fusion'))
        self.posi_fwd_btn.setGeometry(500,120,60,20)
        self.posi_fwd_btn.setIcon(QIcon("C:/Users/rongjv/Desktop/快进.jfif"))
        self.posi_fwd_btn.clicked.connect(self.setsongposi_fwd)

        self.posi_bkd_btn=QPushButton('后退',self)
        self.posi_bkd_btn.setStyle(QStyleFactory.create('Fusion'))
        self.posi_bkd_btn.setGeometry(580,120,60,20)
        self.posi_bkd_btn.setIcon(QIcon("C:/Users/rongjv/Desktop/快退.jfif"))
        self.posi_bkd_btn.clicked.connect(self.setsongposi_bkd)

        self.slider=QSlider(Qt.Horizontal, self)
        self.setStyle(QStyleFactory.create('Fusion'))

        self.slider.setMinimum(0)
        self.slider.setMaximum(1000)
        #self.slider.valueChanged.connect(self.songposition)
        self.slider.sliderMoved.connect(self.songposition)
        self.slider.sliderPressed.connect(self.sl_pr)
        self.slider.sliderReleased.connect(self.sl_re)
        self.slider.valueChanged.connect(self.sl_vc)

        self.volunm_slider=QSlider(Qt.Horizontal, self)
        self.volunm_slider.setGeometry(250,120,100,20)
        self.volunm_slider.setMinimum(0)
        self.volunm_slider.setMaximum(100)
        self.volunm_slider.valueChanged.connect(self.songvolunm)

        self.open_btn=QPushButton('导入歌曲', self)
        self.open_btn.setStyle(QStyleFactory.create('Fusion'))
        self.open_btn.setGeometry(30, 180, 60, 20)
        self.open_btn.clicked.connect(self.load_music_file_func)
        
        self.btn_next=QPushButton('',self)
        self.btn_next.setGeometry(420,90,20,20)
        self.btn_next.setIcon(QIcon('music_play_pro2022\\next1.png'))
        self.btn_next.clicked.connect(self.next_play_func)
        
        self.btn_last=QPushButton('',self)
        self.btn_last.setGeometry(390,90,20,20)
        self.btn_last.setIcon(QIcon('music_play_pro2022\last1.png'))
        self.btn_last.clicked.connect(self.last_play_func)

        self.play_btn = QPushButton('', self)
        self.play_btn.setStyle(QStyleFactory.create('Fusion'))
        self.play_btn.setGeometry(520, 85, 20, 25)
        self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\stopicon.jpeg")))
        self.play_btn.clicked.connect(self.play_or_stop_mainwin_dbclk)

        self.qlist=QListWidget(self)
        self.qlist.doubleClicked.connect(self.doubleplay)
        #self.qlist.setStyle(QStyleFactory.create('Fusion'))
        self.qlist.setGeometry(220, 200, 300, 120)
        
        self.list_music_lrc=QListWidget(self)
        self.list_music_lrc.setGeometry(540,200,200,120)
        self.list_music_lrc.addItem('')

        self.timer=QTimer(self)
        self.timer.start(100)
        self.timer.timeout.connect(self.musictime)

        #测试用
        #self.lbl_text=QLabel(self)
        #self.lbl_text.setGeometry(400,20,100,20)
        #self.lbl_text.setText('000')

        #设置窗口布局
        self.h1_layout.addWidget(self.slider)
        self.gb1.setLayout(self.h1_layout)

        #self.h2_layout.addWidget(self.my_btn)
        #self.h2_layout.addWidget(self.fav_btn)
        #self.gb2.setLayout(self.h2_layout)

        self.setGeometry(100, 100, 800, 400)
        self.setWindowTitle('风尘播放器')
        #self.setWindowFlag(Qt.FramelessWindowHint)
        self.setStyleSheet(self.qss1)
        self.setWindowIcon(QIcon("music_play_pro2022\musicicon2.jpeg"))
        self.show()
    
    def music_list_show_func(self):
        """显示播放列表"""
        #self.music_list_win1=music_list_win(music_list)
        self.music_list_win1.show()
        
    def tool_change_bg_func(self):
        """更改背景色"""

    def do_mediaplayer_statechanged(self,state):
        if state == QMediaPlayer.PlayingState:
            pass
        if state == QMediaPlayer.PausedState:
            pass
        if state == QMediaPlayer.StoppedState:
            self.is_pause = True

    def sl_pr(self):

        self.timer.stop()
        self.cur_posi=self.slider.value()

    def sl_re(self):
        
        self.player.setPosition(self.slider.value()*1000)
        self.timer.start()
        #print(self.player.duration())
        
    def sl_vc(self):
        ...
        #self.lbl_text.setText(str(self.slider.value()))

    def songvolunm(self):

        self.volumevalue=self.volunm_slider.value()
        self.player.setVolume(self.volumevalue)
        self.lbl_volunm.setText(str(self.volumevalue))
        self.lbl_volunm.adjustSize()


    def songposition(self):

        #获取歌曲的时间信息
        self.p1=self.player.duration()
        #将秒转换为00:00的格式
        self.p2=self.p1 / 1000
        self.p3=self.slider.value() * self.p2
        self.ppp = self.slider.value()   
        #self.player.setPosition(int(self.p3))
        #self.label1.setText(time.strftime('%M:%S', time.localtime(self.player.position() / 1000)))

    def setsongposi_fwd(self):

        self.p=self.player.position()+2000
        self.player.setPosition(self.p)

    def setsongposi_bkd(self):
        self.pp=self.player.position()-2000
        self.player.setPosition(self.pp)

    def load_music_file_func(self):
        #获取歌曲所在文件夹路径
        self.qlist.clear()
        self.cur_path=QFileDialog.getExistingDirectory(self, "选取文件夹", 'E:/')
        #判断歌曲文件路径是否存在
        if os.path.exists(self.cur_path):
            #将文件夹中的所有歌曲添加到List中
            for song in os.listdir(self.cur_path):
                #print(song)
                self.songs_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
                music_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
                self.qlist.addItem(song)
            self.music_list_win1=music_list_win(music_list)
            self.music_list_win1.show()

    def musictime(self):

        if self.is_playing:
            self.slider.setMinimum(0)
            self.slider.setMaximum(int(self.player.duration()/1000))

        #设置歌曲实时播放时间进度
        self.label_song_duration_runtime.setText(time.strftime('%M:%S', time.localtime(self.player.position() / 1000)))
        #设置歌曲总时间
        self.label_song_duration_all.setText(time.strftime('%M:%S', time.localtime(self.player.duration() / 1000)))
        #歌曲当前播放位置
        self.cur_posi = int(self.player.position()/1000)
        #print(self.cur_posi)
        self.slider.setValue(self.cur_posi)
    def last_play_func(self):
        """上一首"""
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname_last()
        self.is_playing=True
        if self.volunm_slider.value() == 0:
            self.volunm_slider.setValue(3)
        self.play_or_stop_mainwin_next()
        
    def next_play_func(self):
        """下一首"""
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname_next()
        self.is_playing=True
        if self.volunm_slider.value() == 0:
            self.volunm_slider.setValue(3)
        self.play_or_stop_mainwin_next()
        

    def choosesongname_mainwin_dbclk(self):
        """主窗口双击播放"""
        global music_list_index
        self.index = self.qlist.currentRow()
        music_list_index=self.index       
        #self.playsong = self.songs_list[self.index][-1]
        #self.playsongname=self.songs_list[self.index][0]
        #self.playsong1 = self.playsong.replace('\\', '/')
        self.choose_song_name_2(self.index)
        
    def choosesongname_subwin_dbclk(self):
        """播放列表窗口双击播放"""
        global music_list_index
        self.index2=self.music_list_win1.list_music_list.currentRow()
        music_list_index=self.index2
        #self.playsong =self.songs_list[self.index2][-1]
        #self.playsongname=music_list[self.index2][0]
        #self.playsong1 = self.playsong.replace('\\', '/')
        self.choose_song_name_2(self.index2)
        
    def choosesongname_last(self):
        """主窗口上一首播放"""
        global music_list_index
        
        if music_list_index > 0:
            
            self.index_next=music_list_index-1
        else:
            self.index_next=len(self.songs_list)-1
            
        self.music_list_win1.list_music_list.setCurrentRow(self.index_next)
        
        self.choose_song_name_2(self.index_next)
        
        music_list_index=self.index_next
        
    def choosesongname_next(self):
        """主窗口下一首播放"""
        global music_list_index
        
        if music_list_index < len(self.songs_list)-1:
            
            self.index_next=music_list_index+1
        else:
            self.index_next=0
            
        self.music_list_win1.list_music_list.setCurrentRow(self.index_next)
        
        self.choose_song_name_2(self.index_next)
        
        music_list_index=self.index_next
        
    def choose_song_name_2(self,current_ind:int):
        
        self.playsong = self.songs_list[current_ind][-1]
        self.playsongname=self.songs_list[current_ind][0]
        self.playsong1 = self.playsong.replace('\\', '/')
        self.get_music_info(self.playsong1)
        self.player.setMedia(QMediaContent(QUrl(self.playsong)))
    
   
    def doubleplay(self):
        
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname_mainwin_dbclk()
        self.is_playing=True
        if self.volunm_slider.value() == 0:
            self.volunm_slider.setValue(6)
        self.play_or_stop_mainwin_dbclk()
        
    def doubleplay_subwin(self):
        
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname_subwin_dbclk()
        self.is_playing=True
        if self.volunm_slider.value() == 0:
            self.volunm_slider.setValue(3)
        self.play_or_stop_subwin_dbclk()

    def play_or_stop_mainwin_dbclk(self):
        if self.qlist.count()==0:
            QMessageBox.about(self,'tips','no music')
            return

        if not self.player.isAudioAvailable():
            self.choosesongname_mainwin_dbclk()
            #self.choosesongname_subwin()
            self.lbl_musicname.setText('歌曲名:' + self.playsongname)
            self.lbl_musicname.adjustSize()
           
            #print(self.slider.maximum())
        if self.is_pause:
            self.player.play()
            #self.play_btn.setText('暂停')
            self.is_pause=False
            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\stopicon.jpeg")))
        elif  self.is_pause == False:
            self.player.pause()
            #self.play_btn.setText('播放')
            self.is_pause=True

            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\playicon.jpeg")))
            
    def play_or_stop_subwin_dbclk(self):
        
        if self.qlist.count()==0:
            QMessageBox.about(self,'tips','no music')
            return

        if not self.player.isAudioAvailable():
            #self.choosesongname()
            self.choosesongname_subwin_dbclk()
            self.lbl_musicname.setText('歌曲名:' + self.playsongname)
            self.lbl_musicname.adjustSize()
            
            self.music_lrc_text=self.load_music_lrc('music_play_pro2022\music_lrc\ghsy.lrc')
            #print(self.music_lrc_text)
            lrc_list2=self.fenxi_music_lrc(self.music_lrc_text)
            for i in lrc_list2:
                self.list_music_lrc.addItem(i[1])
            
            #print(self.slider.maximum())
        if self.is_pause:
            self.player.play()
            #self.play_btn.setText('暂停')
            self.is_pause=False
            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\stopicon.jpeg")))
            
        elif  self.is_pause == False:
            self.player.pause()
            #self.play_btn.setText('播放')
            self.is_pause=True
            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\playicon.jpeg")))
        
    def  play_or_stop_mainwin_next(self): 
        
        if self.qlist.count()==0:
            QMessageBox.about(self,'tips','no music')
            return

        if not self.player.isAudioAvailable():
            #self.choosesongname()
            #self.choosesongname_subwin_dbclk()
            #self.choosesongname_next()
            self.lbl_musicname.setText('歌曲名:' + self.playsongname)
            self.lbl_musicname.adjustSize()
            
            self.music_lrc_text=self.load_music_lrc('music_play_pro2022\music_lrc\ghsy.lrc')
            #print(self.music_lrc_text)
            lrc_list2=self.fenxi_music_lrc(self.music_lrc_text)
            for i in lrc_list2:
                self.list_music_lrc.addItem(i[1])
            
            #print(self.slider.maximum())
        if self.is_pause:
            self.player.play()
            #self.play_btn.setText('暂停')
            self.is_pause=False
            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\stopicon.jpeg")))
            
        elif  self.is_pause == False:
            self.player.pause()
            #self.play_btn.setText('播放')
            self.is_pause=True
            self.play_btn.setIcon(QIcon(QPixmap("music_play_pro2022\playicon.jpeg")))
        

    def get_music_info(self,filename):
        
        self.fl=filename
        #print(self.fl)
        #self.probe = ffmpeg.probe(self.fl)
        #self.format = self.probe['format']
        #(self.format)
    def load_music_lrc(self,music_file_name:str):
        with open(music_file_name, "r",encoding="utf-8") as f:
            return f.read()
    def fenxi_music_lrc(self,lrc:str):
        lrc1=lrc
        lrc_list=lrc1.split("\n")
        for i in range(len(lrc_list)):
            lrc_list[i]=lrc_list[i][1:]
            lrc_list[i]=lrc_list[i].split("]")
            m1=int(lrc_list[i][0][:2]) * 60
            m2=float(lrc_list[i][0][3:])
            m=m1+m2
            lrc_list[i][0]=m
        print(lrc_list)
        return lrc_list
        
if __name__ =='__main__':

    app=QApplication(sys.argv)
    mp1=Music_Play_win()
    sys.exit(app.exec_())






qss样式文件:

/*
*
{
color:red;
}
窗体背景色为渐变色
*/
QWidget
{
    background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #81F5D8,stop:0.2 #43ABE7,stop:0.5 #57E7EC stop:1 #8EF068);
}
QListWidget
{
    background-color:qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #81F5D8,stop:0.2 #43ABE7,stop:0.5 #57E7EC stop:1 #8EF068);
}
QMenuBar
{
    background-color:#B5B0F7;
}
QMenu
{
    background-color:#7FCDF1;
}
QPushButton
{
text-align:center;
color:rgb(14, 13, 13);
background-color:rgb(250, 250, 252);
}
QLabel
{
text-align: center;
font:lighter;
font-size:13px;
background-color:rgba(228, 236, 228, 0);
color:black;

}
QGroupBox
{
   background-color:#9EF5E2; 
   
}
QSlider
{
    background-color:#4FF376;
}
QCheckBox
{
    text-align: center;
}
QComboBox
{
text-align: center;
background-color: rgb(248, 249, 250);
}
QLineEdit
{
    background-color: rgb(250, 250, 250);
}
QTextEdit
{
    background-color:antiquewhite;
}
QMessageBox
{   
    icon:'CoDeSys.ico';
    background-color: aquamarine;
}

最终效果(视频):

python音乐播放器演示(优化版)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<Python>PyQt5自己编写一个音乐播放器(优化版) 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代

随机推荐

  • 利用pthread进行数组求和

    POSIX thread 简称为pthread xff0c Posix线程是一个 POSIX 标准线程 利用多线程可以提高运算速度 利用pthread进行数组求和的程序如下 xff1a include lt stdio h gt inclu
  • 字符串的全排列程序

    include lt iostream gt include lt cstring gt using namespace std void swap char str int i int j char tmp 61 str i str i
  • Google面试总结

    分享 Google面试总结 来源 xff1a 王冠中的日志 终于把Google的面试给搞完了 xff0c 感觉可以算是Tech Interview的顶峰了 这里主要写一下大概流程和内容 xff0c 给大家以后interview一个参考 G的
  • 【硬件在环Hil联调问题记录1】

    硬件在环Hil联调问题记录1 simulink中 quadprog 函数代码生成解决方案 Carsim加载不同版本Matlab的操作 仿真时各模块的作用 xff1a Simulink xff08 2019b xff09 控制算法 Carsi
  • C++ boost和C++ stl的区别和联系

    C C 43 43 语言的一大特点是其标准库可以用语言自身实现 C 标准库的 strlen strcpy strcmp 系列函数是教学与练习的好题材 xff0c C 43 43 标准库的 complex string vector 则是类
  • 最新(2023.3.17)配置llvm、clang、clangd、clang-tidy方法,极其简单,轻松上手

    Linux 1 我的Linux是Ubuntu22 04 xff0c 首先把软件下载源改成国内的aliyun xff0c 很简单 xff0c 按照我的这个来做就行 点开这个图标 xff0c 然后点击下面这个 在download from那里把
  • Ubuntu 网线直连(开机自动配置ip地址、启动vnc),vnc远程桌面

    sudo ifconfig enp4s0 upsudo ifconfig enp4s0 192 168 1 20 xff08 要和pc机保证在相同网段 xff09 vncserver 2以下为开机启动配置和启动操作如果需要开机自行配制 启动
  • iftop 较全

    iftop nBNP nbsp i nbsp enp2s0 nbsp f dst port 6379 可以使用iftop命令的 f选项来过滤指定的端口 该选项允许您指定BPF过滤器规则 用于仅显示符合规则的流量 例如 以下命令将仅显示目标端
  • 随机生成slam 真值和里程计值的 g2o 文件(python实现)

    生成了slam 里程计的真值和里程计的值 并保存顶点和边为 g2o文件 nbsp 随机生成slam 真值和里程计值的 g2o 文 件 gen test data py import numpy as np import matplotlib
  • 滑膜+pid+上层设计下层平均分配 优化分配 动态载荷分配

    滑膜 43 pid 43 上层设计下层平均分配 优化分配 动态载荷分配 xff0c 分布式电动汽车操稳控制 本研究在matlab simulink建立七自由度轮毂电机驱动汽车模型 xff0c 使用滑膜联合控制以及pid控制实现转向过程中质心
  • 12本Python书籍推荐

    Python是用于各种任务和领域的优秀编程语言之一 Python的用户友好性 xff0c 高级特性以及对简单性和增强代码可读性的强调使其成为全球许多开发人员的理想选择 诸如此类的功能使应用程序开发 xff0c 数据科学 xff0c 人工智能
  • Ubuntu 屏幕翻转90度怎么恢复

    笔记本电脑的 ubuntu 屏幕有时候会无意中90度翻转 xff0c 这时候你只能侧着脸看 xff0c 靠鼠标操作想要恢复是极其尴尬的一件事 xff0c 最快捷的方法就用命令是删除 iio sensor proxy 程序 第一步 Ctrl
  • 使用Python+Opencv从摄像头逐帧读取图片保存在本地

    今天测试的时候 xff0c 遇到了一个问题 xff0c 测试需求是 xff0c 需要把摄像头拍摄的实时视频逐帧率保存下来 经过查阅资料以及网友帮助 xff0c 目前已经完成 记录下来希望可以帮助有需要的朋友 1 思路 使用Python 43
  • vscode 运行C++

    本文先介绍了windows下 VSCODE运行C 43 43 前 xff0c 搭建C 43 43 运行环境的必要步骤 后介绍了tasks json launch json的作用 xff0c 并给出了自己使用的配置方案 最后给出了常见问题的解
  • 在执行launch文件时,如果显示不存在这个package

    在执行launch文件时 xff0c 如果显示不存在这个package xff0c 则应注意可能是下述情况导致 xff1a catmake编译完 xff0c 再用rosrun或roslaunch命令找不到package时 xff0c 这时需
  • 迷一样的穿越机飞控电容的作用

    穿越机电源上要并个大电容 xff0c 今天终于碰到一位真神说明白了 xff1a 电容两个作用 xff0c 一个是在你插电的一瞬间 xff0c 因为里面有降压设备大部分都是线圈类的东西 xff0c 产生电磁效应会有高于电池特别高的电压 xff
  • 一、机械小白学单片机之初认识ESP8266

    前言 本人刚接触单片机开发 xff0c 原专业为机械自动化 xff0c 因为传统机械行业的不景气 xff0c 想要转为从事电子行业 之前有一点C语言基础 xff0c 还学过一点点C xff0c 但是也就一点点 可谓小白学习之路 希望能够给大
  • VB.net写一个简易串口RS485调试助手

    最近在调试带rs485串口通讯的设备 xff0c 项目上主要是用PLC和串口通讯 xff0c 因为PLC有集成好的串口块 xff0c 使用起来比较容易 xff0c 为了方便测试 xff0c 就想着用上位机写一个简易的串口通讯程序 xff0c
  • 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后 总想着利用它去做些什么 无论是制作小工具还是小游戏 都是一种锻炼 那么 利用python加上PyQt5写一个简单的音乐播放器 可能会是一个有趣的体验 下面我会分享一下如何编写简易的音乐播放器 其中参考了网络上的很
  • <Python>PyQt5自己编写一个音乐播放器(优化版)

    Python音乐播放器 更新日志 xff1a 20221031 xff1a 添加独立播放列表 20221107 xff1a 添加 上一首 下一首 功能 展示图片 xff1a 202211071308更新 xff1a 添加上一首 下一首功能