Search code examples
pythonpyqt5python-3.6volume

how to connect volume slider in it to work with it


from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaMetaData

from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog, QSlider

class Ui_MainWinpage(object):
    def setupUi(self, MainWinpage):
        MainWinpage.setObjectName("MainWinpage")
        MainWinpage.resize(507, 301)
        self.centralwidget = QtWidgets.QWidget(MainWinpage)
        self.centralwidget.setAutoFillBackground(True)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        #slider
        self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
        self.horizontalSlider.setGeometry(QtCore.QRect(190, 180, 160, 16))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.horizontalSlider.valueChanged[int].connect(self.changeValue)
        self.gridLayout.addWidget(self.horizontalSlider, 0, 0, 1, 3)
        self.play_song = QtWidgets.QPushButton(self.centralwidget)
        self.play_song.setObjectName("play_song")
        self.gridLayout.addWidget(self.play_song, 1, 0, 1, 1)
        self.pause_song = QtWidgets.QPushButton(self.centralwidget)
        self.pause_song.setObjectName("pause_song")
        self.gridLayout.addWidget(self.pause_song, 1, 1, 1, 1)
        self.stop_song = QtWidgets.QPushButton(self.centralwidget)
        self.stop_song.setObjectName("stop_song")
        self.gridLayout.addWidget(self.stop_song, 1, 2, 1, 1)
        self.previous = QtWidgets.QPushButton(self.centralwidget)
        self.previous.setObjectName("previous")
        self.gridLayout.addWidget(self.previous, 2, 0, 1, 1)
        self.shuffle = QtWidgets.QPushButton(self.centralwidget)
        self.shuffle.setObjectName("shuffle")
        self.gridLayout.addWidget(self.shuffle, 2, 1, 1, 1)
        self.next = QtWidgets.QPushButton(self.centralwidget)
        self.next.setObjectName("next")
        self.gridLayout.addWidget(self.next, 2, 2, 1, 1)
        #for volume
        self.volumeSlider = QSlider(Qt.Horizontal)
        self.volumeSlider.setMaximum(32767)
        self.volumeSlider.setPageStep(1024)
        self.gridLayout.addWidget(self.volumeSlider, 4, 0, 1, 2)

        MainWinpage.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWinpage)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 507, 22))
        self.menubar.setObjectName("menubar")
        self.menufile = QtWidgets.QMenu(self.menubar)
        self.menufile.setObjectName("menufile")
        MainWinpage.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWinpage)
        self.statusbar.setObjectName("statusbar")
        MainWinpage.setStatusBar(self.statusbar)
        self.actionopen = QtWidgets.QAction(MainWinpage)
        self.actionopen.setObjectName("actionopen")
        self.menufile.addAction(self.actionopen)
        self.menubar.addAction(self.menufile.menuAction())

        self.pushButton = QtWidgets.QPushButton(MainWinpage)

        self.pushButton.setObjectName("pushButton")
        #for Qtmultimedia
        self.media_player = QMediaPlayer()
        self.media_player.durationChanged.connect(self.horizontalSlider.setMaximum)
        self.media_player.positionChanged.connect(self.horizontalSlider.setValue)
        self.volumeSlider.valueChanged.connect(self.changeVolume)
        self.retranslateUi(MainWinpage)
        QtCore.QMetaObject.connectSlotsByName(MainWinpage)

    def retranslateUi(self, MainWinpage):
        _translate = QtCore.QCoreApplication.translate
        MainWinpage.setWindowTitle(_translate("MainWinpage", "MainWindow"))
        self.play_song.setText(_translate("MainWinpage", "play"))
        self.pause_song.setText(_translate("MainWinpage", "pause"))
        self.stop_song.setText(_translate("MainWinpage", "stop"))
        self.previous.setText(_translate("MainWinpage", "previous"))
        self.shuffle.setText(_translate("MainWinpage", "shuffle"))
        self.next.setText(_translate("MainWinpage", "next"))
        self.menufile.setTitle(_translate("MainWinpage", "file"))
        self.actionopen.setText(_translate("MainWinpage", "open "))

        self.previous.setText(_translate("MainWinpage", "Browse"))
        self.previous.clicked.connect(self.pushButton_handler)
        self.play_song.clicked.connect(self.play_music)
        self.pause_song.clicked.connect(self.pause_music)
        self.stop_song.clicked.connect(self.stop_music)

    def changeValue(self, value):
        blocked = self.media_player.blockSignals(True)
        value = self.horizontalSlider.value()
        self.media_player.setPosition(value)
        self.media_player.blockSignals(blocked)

    def changeVolume(self, value):
        self.volume = value


    def pushButton_handler(self):
        print("Button pressed")
        self.open_dialog_box()

    #for opening that file which you want to open
    def open_dialog_box(self):
        filename = QFileDialog.getOpenFileName()
        path = str(filename[0])
        self.media_player.setMedia(QMediaContent(QtCore.QUrl.fromLocalFile(path)))
        print("path is ",path)
        self.globalpath = path
        print("global paths is ", self.globalpath)

    #for playing that file which we had choosen from
    def play_music(self):
        artist = self.media_player.metaData(QMediaMetaData.AlbumArtist)
        title = self.media_player.metaData(QMediaMetaData.Title)
        self.media_player.play()
        print("song name:",self.globalpath)
        print(f"Now playing: {title} by {artist}")

    #for pause that selected music
    def pause_music(self):
        self.media_player.pause()
        print("song is paused")

    #for stoping that music
    def stop_music(self):
        self.media_player.stop()
        print("song is stopped")


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

Solution

  • Instead of using pygame.mixer you could consider using PyQt5.QtMultimedia.QMediaPlayer. This has the advantage that QMediaPlayer emits signals when the duration and/or current position of the song has changed which you can use to update the position and the maximum value of the slider. The metadata of the song (title, artist, etc.) can be accessed via QMediaPlayer.metaData, e.g.

    from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaMetaData
    
    class Ui_MainWinpage(object):
        def setupUi(self, MainWinpage):
            ....
            self.media_player = QMediaPlayer()
            self.media_player.durationChanged.connect(self.horizontalSlider.setMaximum)
            self.media_player.positionChanged.connect(self.horizontalSlider.setValue)
    
        def changeValue(self, value):
            blocked = self.media_player.blockSignals(True)
            value = self.horizontalSlider.value()
            self.media_player.setPosition(value)
            self.media_player.blockSignals(blocked)
    
        def open_dialog_box(self):
            filename = QFileDialog.getOpenFileName()
            path = str(filename[0])
            self.media_player.setMedia(QMediaContent(QtCore.QUrl.fromLocalFile(path)))
            print("path is ",path)
            self.globalpath = path
    
        def play_music(self):
            artist = self.media_player.metaData(QMediaMetaData.AlbumArtist)
            title = self.media_player.metaData(QMediaMetaData.Title)
            self.media_player.play()
            print(f"Now playing: {title} by {artist}")
    
        def pause_music(self):
            self.media_player.pause()
            print("song is paused")
    
        def stop_music(self):
            self.media_player.stop()
            print("song is stopped")