我想制作三种可以调节歌曲的游戏模式
你可以看到on_finish()
方法,这是我写的关于播放模式的方法
这三种模式是ordered
,random
和replay
但是我得到了一些错误,这首歌不能遵循这些游戏模式。
例如,
歌曲列表: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
答案 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.finished
与self.on_finish
联系起来。每次调用该函数时,您都要添加一个连接
如果您尝试下面的示例,只需单击按钮,您就会看到该插槽被调用两次:
button=QtGui.QPushButton("my button")
button.clicked.connect(on_click)
button.clicked.connect(on_click)
def on_click():
print("slot called")
通常,您只在__init__
函数中连接信号和插槽,因为此函数只被调用一次。