滑块寻找位置pygamemixer

问题描述

我可以使用 QTimer 和 Pygame 混合器的 MP3 位置设置值来更新 QSlider。但是,我希望能够来回寻找并保持准确的时间。

from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtCore import QSize,Qt,QTimer
import pygame
from mutagen.mp3 import MP3

pygame.init()

class Ui_MainWindow(object):
    def setupUi(self,MainWindow):
        MainWindow.setobjectName("MainWindow")
        MainWindow.resize(791,125)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setobjectName("centralwidget")
        self.timeSlider = QtWidgets.QSlider(self.centralwidget)
        self.timeSlider.setGeometry(QtCore.QRect(180,30,421,22))
        self.timeSlider.setorientation(QtCore.Qt.Horizontal)
        self.timeSlider.setobjectName("timeSlider")
        self.playBtn = QtWidgets.QPushButton(self.centralwidget)
        self.playBtn.setGeometry(QtCore.QRect(30,75,23))
        self.playBtn.setobjectName("playBtn")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,791,21))
        self.menubar.setobjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setobjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.timer=QTimer()
        self.timer.setInterval(1000)
        

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self,MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setwindowTitle(_translate("MainWindow","MainWindow"))
        self.playBtn.setText(_translate("MainWindow","Play"))
        self.playBtn.clicked.connect(self.play)
        self.timeSlider.valueChanged.connect(self.slider_changed)
        self.timer.timeout.connect(self.slider_changed)

    def play(self):
        pygame.mixer.music.load('C:/mp3/audio/Your love.mp3')
        pygame.mixer.music.play()
        self.timer.start(1000)

    def slider_changed(self):
        song_mutagen=MP3('C:/mp3/audio/Your love.mp3')
        songLength = song_mutagen.info.length
        self.timeSlider.setMaximum(songLength)
        current_time=int(pygame.mixer.music.get_pos()/1000)
        self.timeSlider.setValue(current_time)
        


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

解决方法

终于搞定了。当 QTimer 调用 keep_time 函数时,每秒向 self.timeSlider.value() 添加 1 个整数允许我修改滑块而不是将其锁定到设置值.如果它可以帮助任何想要创建自己的 MP3 播放器的人,我会添加它。我相信还有其他方法可以做到这一点,我对此非常关注。

up top change self.timeSlider.sliderMoved.connect(self.slider_changed)(原为.valueChanged)将滑块的位置发送给slider_changed函数

############################################ #################################

 def retranslateUi(self,MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow","MainWindow"))
        self.playBtn.setText(_translate("MainWindow","Play"))
        self.playBtn.clicked.connect(self.play)
        self.timeSlider.sliderMoved.connect(self.slider_changed)
        self.timer.timeout.connect(self.keep_time)
    def play(self):
        pygame.mixer.music.load('C:/mp3/audio/Your Love.mp3')
        self.timeSlider.setValue(0)
        pygame.mixer.music.play()
        self.timer.start()
    def slider_changed(self,position):
        song_mutagen=MP3('C:/mp3/audio/Your Love.mp3')
        songLength = song_mutagen.info.length
        self.timeSlider.setMaximum(songLength)
        self.timeSlider.blockSignals(True)
        pygame.mixer.music.set_pos(position)
        self.timeSlider.blockSignals(False)
        
####Qtimer calls this function every second to update the slider starting from 0 
    def keep_time(self):
        self.timeSlider.setMinimum(0)
        song_mutagen=MP3('C:/mp3/audio/Your Love.mp3')
        songLength = song_mutagen.info.length
        self.timeSlider.setMaximum(songLength)
        next_time = self.timeSlider.value() +1 #Add 1 to the Slider value each pass
        self.timeSlider.setValue(next_time)      #Set the Value to next time value
           
        if next_time >= songLength:
             self.timer.stop()