2013-04-01 137 views
0

为了保持简短,在pyqt4中寻找播放声音的方法后,我仍然无法弄清楚为什么这个简单的小代码不起作用?我没有收到任何错误信息或任何内容,但是取而代之的是声音(我试过mp3,ogg和wav),我只是得到了一些窗口“bing”的声音,而不是我想要的声音文件。我知道有声子,但我真的想用各种原因使用QSound,也因为它应该更简单。如果你可以给我任何暗示为什么这不起作用,或者给出一个使用QSound的工作代码的例子,我会非常感激。使用Pyqt4和QSound播放声音

import sys 
from PyQt4 import QtGui, QtCore 
from PyQt4.QtGui import QSound 

class Example(QtGui.QMainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.initUI() 

    def initUI(self): 

     self.setGeometry(300,300,200,200) 

     self.b1 = QtGui.QPushButton("Play", self) 
     self.b1.clicked.connect(self.Play) 
     self.b1.move(50, 80) 


    def Play(self): 

     QSound.play("C:\directory\b1.mp3") 




def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 
+0

python不使用C字符串吗?你不是想写“C:/directory/b1.mp3”吗? – Amartel

+0

@Amartel:你是什么意思的“C字符串”? Python与Python字符串一起工作,这是一个完全有效的字符串。另外,您可以在大多数API中使用本机路径名,并且在某些情况下需要这样做。 – abarnert

回答

3

这里可能有两个不同的问题。


首先,如果要使用Windows风格的路径名,则需要使用原始字符串或反斜杠转义字符。在一个常规字符串中,\b是单个退格字符,而不是\,后面跟着b。换句话说,当你真的想播放文件C:\\directory\\b1.mp3时,你正试图播放文件'C:\ directory \ x081.mp3'。有关详细信息,请参阅文档中的String and Bytes literals

您可以尝试记住所有特殊的反斜杠转义字符,但更简单的解决方案是始终转义所有反斜杠。或者,更简单的说,对于所有Windows风格的路径名使用原始字符串。或者,甚至更简单,如果你使用的函数允许在Windows上使用POSIX风格的路径名,就使用它们。换句话说,执行下列操作之一:

"C:\directory\\b1.mp3" 
"C:\\directory\\b1.mp3" 
r"C:\directory\b1.mp3" 
"C:/directory/b1.mp3" 

最重要的是,如果你使用的PyQt的是旧版本,你不能调用静态的Qt方法的方式。换句话说,你不是调用QSound::play(filename)静态方法,而是调用QSound::play()实例(slot)方法。在后来的版本中,这应该没什么问题 - 尽管如文档所述,构建QSound并将其play方法称为“可以......立即播放”,因此无论如何您都可能需要这样做。

如果你有这个问题,解决它的方法是:

QSound(r"C:\directory\b1.mp3").play() 

虽然在实际的代码,您可能希望让大部分的QSound对象而不是周围的重新创建它们各一次。


在评论,你说:

我发现,QSound的居然不支持的资源。不幸的是,我不知道这意味着什么,也许你可以解释我的代码意味着什么。

这对您的代码没有任何意义,至少不是今天。你已经在常规文件中获得了你的声音,并且你试图通过绝对路径名来访问这些文件。

但是,如果您想在将来改进您的应用程序,它可能会阻碍。

资源在The Qt Resource System中解释。这个想法是,而不是有一堆单独的文件的图像等,你只有一个可执行文件,如MyApp.exe,所有的资源文件挤入该可执行文件。在运行时,您仍然可以像访问这些资源一样仍然是单独的文件来访问这些资源。您只需使用特殊路径(如:/sounds/b1.mp3)(或者,更好地,从路径名切换到网址,并使用特殊网址,例如qrc:///sounds/b1.mp3)。

踢球者是“差不多”。有些功能不直接在资源上工作,因此如果要使用这些功能,则必须明确地将资源提取到临时文件。

+0

好的。很多编辑哈哈。但我还没有真正澄清。 我从你的答案中得到的是我必须将QSound.play(“C:\ a \ b \ c \ d \ b1.mp3”)更改为QSound(“C:\ a \ b \ c \ d \\ b1.mp3“)。play()仍然不起作用 –

+0

在''C:\ a \ b \ c \\ b1.mp3”'中,您已经添加了另一个未转义的'\ b',所以您有同样的问题再次。这就是为什么我建议使用原始字符串或POSIX风格的路径要比试图找出你做什么或不需要转义更简单。 – abarnert

+0

我发现QSound实际上不支持资源。不幸的是,我不知道这意味着什么,也许你可以解释我的代码意味着什么。 –