如何按顺序,随机和重播播放歌曲?

时间:2015-07-22 06:15:03

标签: python pyqt

我想制作三种可以调节歌曲的游戏模式 你可以看到on_finish()方法,这是我写的关于播放模式的方法 这三种模式是orderedrandomreplay 但是我得到了一些错误,这首歌不能遵循这些游戏模式。

例如,
歌曲列表:ABCDEFG,现在正在播放A
当我点击有序时,它将首先播放下一首歌曲(B),然后播放下一首第三首歌曲(E) 但它应该首先播放歌曲B,然后播放歌曲C,而不是歌曲E.
并且随机发生同样的事情 然后我尝试打印(路径),我发现代码会立即执行,然后三次,最后是夜晚.......

我不知道问题出在哪里。

这是我的music_1.py代码。

#!/usr/bin/python
# -*- coding: utf-8 -*-

# music_1.py

import sys
import random
from PyQt4 import QtGui, QtCore
from PyQt4 import phonon
from music_ui import Ui_Form

warmpath_list=[r"C:\Users\Jacky\Desktop\music_list\warm\song1.mp3",
               r"C:\Users\Jacky\Desktop\music_list\warm\song2.mp3",
               r"C:\Users\Jacky\Desktop\music_list\warm\song3.wma",
               r"C:\Users\Jacky\Desktop\music_list\warm\song4.mp3",
               r"C:\Users\Jacky\Desktop\music_list\warm\song5.mp3",
               r"C:\Users\Jacky\Desktop\music_list\warm\song6.wma",

funnypath_list=[r"C:\Users\Jacky\Desktop\music_list\funny\songa.wma",                   
                r"C:\Users\Jacky\Desktop\music_list\funny\songb.wma",
                r"C:\Users\Jacky\Desktop\music_list\funny\songc.wma ",
                r"C:\Users\Jacky\Desktop\music_list\funny\songd.wma"]

class Music(QtGui.QDialog): 
    def __init__(self, parent=None): 
        QtGui.QDialog.__init__(self, parent)
        self.setWindowTitle('Player')
        self.ui = Ui_Form() 
        self.ui.setupUi(self)


        self.mediaObject = phonon.Phonon.MediaObject(self)  
        self.audioOutput = phonon.Phonon.AudioOutput(phonon.Phonon.MusicCategory, self)
        phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
        self.ui.volumeSlider.setAudioOutput(self.audioOutput)
        self.ui.seekSlider.setMediaObject(self.mediaObject)
        self.mediaObject.tick.connect(self.tick)  

        self.timeLcd = QtGui.QLCDNumber(self)
        self.timeLcd.display('00:00')
        self.timeLcd.setGeometry(480, 330, 100, 50)


        self.ui.listWidget.insertItem(0,"warm")  
        self.ui.listWidget.insertItem(1,"funny")

        self.ui.listWidget_3.insertItem(0,"song1")  
        self.ui.listWidget_3.insertItem(1,"song2")
        self.ui.listWidget_3.insertItem(2,"song3")
        self.ui.listWidget_3.insertItem(3,"song4")
        self.ui.listWidget_3.insertItem(4,"song5")
        self.ui.listWidget_3.insertItem(5,"song6")


        self.ui.listWidget_2.insertItem(0,"songa")     
        self.ui.listWidget_2.insertItem(1,"songb")
        self.ui.listWidget_2.insertItem(2,"songc")
        self.ui.listWidget_2.insertItem(3,"songd")

        self.connect(self.ui.listWidget,QtCore.SIGNAL("currentRowChanged(int)"),self.ui.stackedWidget,QtCore.SLOT("setCurrentIndex(int)")) 
        self.connect(self.ui.listWidget_2,QtCore.SIGNAL("currentRowChanged(int)"),self.openaudio)
        self.connect(self.ui.listWidget_3,QtCore.SIGNAL("currentRowChanged(int)"),self.openaudio)      


        self.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'),self.mediaObject.pause)
        self.connect(self.ui.pushButton_4, QtCore.SIGNAL('clicked()'),self.mediaObject.play) 
        self.connect(self.ui.pushButton_5, QtCore.SIGNAL('clicked()'),self.mediaObject.stop) 
        self.connect(self.ui.pushButton_2, QtCore.SIGNAL('clicked()'),self.m_previous) 
        self.connect(self.ui.pushButton_3, QtCore.SIGNAL('clicked()'),self.m_next) 


        popmenu = QtGui.QMenu(self.ui.pushButton_6)
        group = QtGui.QActionGroup(self.ui.pushButton_6) 
        group.setExclusive(True)

        for i in range(1, 4):
            if i==1:
                action = group.addAction('oordered')
                action.setCheckable(True)
                #action.setChecked(True) 

            if i==2:
                action = group.addAction('replay')
                action.setCheckable(True)

            if i==3:
                action = group.addAction('random')
                action.setCheckable(True)

            popmenu.addAction(action)
        self.ui.pushButton_6.setMenu(popmenu)

        group.triggered.connect(self.sortedEvent) # sortedEvent()



    def tick(self, time): 
        displayTime = QtCore.QTime(0, (time / 60000) % 60, (time / 1000) % 60)
        self.timeLcd.display(displayTime.toString('mm:ss'))

    def openaudio(self,path):       
        self.connect(self.ui.listWidget_2,QtCore.SIGNAL('currentTextChanged(QString)'),self.ui.label_4,QtCore.SLOT('setText(QString)'))
        self.connect(self.ui.listWidget_3,QtCore.SIGNAL('currentTextChanged(QString)'),self.ui.label_4,QtCore.SLOT('setText(QString)'))

        if self.ui.stackedWidget.currentIndex()==0:
            index1=self.ui.listWidget_3.currentRow()
            path=warmpath_list[index1]                               

        if self.ui.stackedWidget.currentIndex()==1:
            index2=self.ui.listWidget_2.currentRow()
            path=funnypath_list[index2]

        self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(path))
        self.mediaObject.play()
        self.mediaObject.finished.connect(self.on_finish)


    def m_next(self): # to play the next song
        if self.ui.stackedWidget.currentIndex()==0:
            index1=self.ui.listWidget_3.currentRow()
            if index1==len(warmpath_list)-1:
                path=warmpath_list[0]
                self.ui.listWidget_3.setCurrentRow(0)
            else:
                 path=warmpath_list[index1+1]
                 self.ui.listWidget_3.setCurrentRow(index1+1)                                                          
            print(path)
            self.openaudio(path)     

        if self.ui.stackedWidget.currentIndex()==1:
            index2=self.ui.listWidget_2.currentRow()
            if index2==len(funnypath_list)-1:
                path=funnypath_list[0]
                self.ui.listWidget_2.setCurrentRow(0)                    
            else:
                path=funnypath_list[index2+1]                  
                self.ui.listWidget_2.setCurrentRow(index2+1)
            self.openaudio(path)


    def m_previous(self): # to play the previous song
        if self.ui.stackedWidget.currentIndex()==0:
            index1=self.ui.listWidget_3.currentRow()
            if index1==len(warmpath_list)-len(warmpath_list):
                path=warmpath_list[len(warmpath_list)-1]
                self.ui.listWidget_3.setCurrentRow(len(warmpath_list)-1)
            else:
                 path=warmpath_list[index1-1]       
                 self.ui.listWidget_3.setCurrentRow(index1-1)
            print(path)    
            self.openaudio(path)

        if self.ui.stackedWidget.currentIndex()==1:
            index2=self.ui.listWidget_2.currentRow()
            if index2==len(funnypath_list)-len(funnypath_list):
                path=funnypath_list[len(funnypath_list)-1]
                self.ui.listWidget_2.setCurrentRow(len(funnypath_list)-1)
            else:
                 path=funnypath_list[index2-1]       
                 self.ui.listWidget_2.setCurrentRow(index2-1)
            print(path)    
            self.openaudio(path)

    def sortedEvent(self,action):       
        self.whatToDoNext=action.text()

    def on_finish(self):
        if self.whatToDoNext=="ordered":     # Order of play
            if self.ui.stackedWidget.currentIndex()==0:
                index1=self.ui.listWidget_3.currentRow()
                if index1==len(warmpath_list)-1:
                    path=warmpath_list[0]
                    self.ui.listWidget_3.setCurrentRow(0)
                else:
                    path=warmpath_list[index1+1]
                    self.ui.listWidget_3.setCurrentRow(index1+1)                                                          
                print(path)
                self.openaudio(path)
            if self.ui.stackedWidget.currentIndex()==1:
                index2=self.ui.listWidget_2.currentRow()
                if index2==len(funnypath_list)-1:
                    path=funnypath_list[0]
                    self.ui.listWidget_2.setCurrentRow(0)                    
                else:
                    path=funnypath_list[index2+1]                  
                    self.ui.listWidget_2.setCurrentRow(index2+1)
                self.openaudio(path)


        elif self.whatToDoNext=="random": # random of play
            if self.ui.stackedWidget.currentIndex()==0:
                path = random.choice(warmpath_list)
                self.ui.listWidget_3.setCurrentRow(warmpath_list.index(path))
                print(path)
                self.openaudio(path)

            if self.ui.stackedWidget.currentIndex()==1:
                path = random.choice(funnypath_list)
                self.ui.listWidget_2.setCurrentRow(funnypath_list.index(path))
                self.openaudio(path)

        else: # replay
            self.mediaObject.stop()
            self.mediaObject.play()

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = Music() 
    myapp.show() 
    sys.exit(app.exec_())

以下是music_ui .py

的代码
from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(600, 400)
        self.seekSlider = phonon.Phonon.SeekSlider(Form)
        self.seekSlider.setGeometry(QtCore.QRect(230, 250, 361, 20))
        self.seekSlider.setObjectName(_fromUtf8("seekSlider"))
        self.volumeSlider = phonon.Phonon.VolumeSlider(Form)
        self.volumeSlider.setGeometry(QtCore.QRect(20, 360, 151, 22))
        self.volumeSlider.setObjectName(_fromUtf8("volumeSlider"))
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(420, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton_2 = QtGui.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(300, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_3 = QtGui.QPushButton(Form)
        self.pushButton_3.setGeometry(QtCore.QRect(540, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
        self.pushButton_4 = QtGui.QPushButton(Form)
        self.pushButton_4.setGeometry(QtCore.QRect(480, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))
        self.pushButton_5 = QtGui.QPushButton(Form)
        self.pushButton_5.setGeometry(QtCore.QRect(360, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_5.setFont(font)
        self.pushButton_5.setObjectName(_fromUtf8("pushButton_5"))
        self.label_3 = QtGui.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(490, 30, 81, 71))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(16)
        self.label_3.setFont(font)
        self.label_3.setFrameShape(QtGui.QFrame.StyledPanel)
        self.label_3.setTextFormat(QtCore.Qt.AutoText)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(230, 60, 161, 61))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_4 = QtGui.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(230, 130, 341, 31))
        font = QtGui.QFont() 
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.groupBox = QtGui.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(10, 30, 201, 321))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.groupBox.setFont(font)
        self.groupBox.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.listWidget = QtGui.QListWidget(self.groupBox)
        self.listWidget.setGeometry(QtCore.QRect(10, 30, 171, 51))
        self.listWidget.setFrameShape(QtGui.QFrame.NoFrame)
        self.listWidget.setFrameShadow(QtGui.QFrame.Plain)
        self.listWidget.setViewMode(QtGui.QListView.ListMode)
        self.listWidget.setObjectName(_fromUtf8("listWidget"))
        self.stackedWidget = QtGui.QStackedWidget(self.groupBox)
        self.stackedWidget.setGeometry(QtCore.QRect(10, 90, 181, 221))
        self.stackedWidget.setFrameShape(QtGui.QFrame.StyledPanel)
        self.stackedWidget.setObjectName(_fromUtf8("stackedWidget"))
        self.page = QtGui.QWidget()
        self.page.setObjectName(_fromUtf8("page"))
        self.listWidget_3 = QtGui.QListWidget(self.page)
        self.listWidget_3.setGeometry(QtCore.QRect(0, 0, 181, 221))
        self.listWidget_3.setFrameShape(QtGui.QFrame.NoFrame)
        self.listWidget_3.setObjectName(_fromUtf8("listWidget_3"))
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName(_fromUtf8("page_2"))
        self.listWidget_2 = QtGui.QListWidget(self.page_2)
        self.listWidget_2.setGeometry(QtCore.QRect(0, 0, 181, 221))
        self.listWidget_2.setFrameShape(QtGui.QFrame.NoFrame)
        self.listWidget_2.setObjectName(_fromUtf8("listWidget_2"))
        self.stackedWidget.addWidget(self.page_2)
        self.pushButton_6 = QtGui.QPushButton(Form)
        self.pushButton_6.setGeometry(QtCore.QRect(240, 280, 40, 40))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Agency FB"))
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_6.setFont(font)
        self.pushButton_6.setObjectName(_fromUtf8("pushButton_6"))

        self.retranslateUi(Form)
        self.stackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.pushButton.setText(_translate("Form", "|  |", None))
        self.pushButton_2.setText(_translate("Form", "<", None))
        self.pushButton_3.setText(_translate("Form", ">", None))
        self.pushButton_4.setText(_translate("Form", "►", None))
        self.pushButton_5.setText(_translate("Form", "■", None))
        self.label_2.setText(_translate("Form", "Now is playing........", None))
        self.label_4.setText(_translate("Form", "m u s i c", None))
        self.groupBox.setTitle(_translate("Form", "  music list  ", None))
        self.pushButton_6.setText(_translate("Form", "▦", None))

from PyQt4 import phonon

1 个答案:

答案 0 :(得分:0)

您的代码中至少有两个问题:

  • m_next(),您正在呼叫self.ui.listWidget_3.setCurrentRow(0) 然后使用self.openaudio(path)

    播放下一首歌曲

    问题是,您之前连接了行更改信号 listWidget到播放歌曲的功能:

    self.connect(self.ui.listWidget_3,QtCore.SIGNAL(&#34; currentRowChanged(INT)&#34),self.openaudio)

    你两次打电话给self.openaudio(path),所以你得到了一些 意外行为。

  • 连接相同的插槽并多次发出信号 在功能openaudio(self,path)中,您将mediaObject.finishedself.on_finish联系起来。每次调用该函数时,您都要添加一个连接 如果您尝试下面的示例,只需单击按钮,您就会看到该插槽被调用两次:

    button=QtGui.QPushButton("my button")
    button.clicked.connect(on_click)
    button.clicked.connect(on_click)
    
    def on_click():
        print("slot called")
    

通常,您只在__init__函数中连接信号和插槽,因为此函数只被调用一次。