[英]Playing sound with Pyqt4 and QSound
为了简短起见,经过数小时的寻找在pyqt4中播放声音的方法之后,我仍然不明白为什么这个简单的小代码不起作用? 我没有收到任何错误消息,但没有声音(我尝试过mp3,ogg和wav),只是得到了一些Windows“ bing”声音,但没有我想要的声音文件。 我知道有声子,但出于各种原因,我真的很想使用QSound,还因为它应该更简单。 如果您能给我任何提示为什么不起作用或使用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()
您在这里可能有两个不同的问题。
首先,如果要使用Windows样式的路径名,则需要使用原始字符串或反斜杠转义符。 在常规字符串中, \\b
是单个退格字符,而不是\\
后跟a b
。 换句话说,当您确实要播放文件C:\\\\directory\\\\b1.mp3
时,您正在尝试播放文件'C:\\ directory \\ x081.mp3'。 有关详细信息,请参见文档中的字符串和字节文字 。
您可以尝试记住所有特殊的反斜杠转义字符,但更简单的解决方案是始终转义所有反斜杠。 或者,甚至更简单地,将原始字符串用于所有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()
实例(插槽)方法。 在更高版本中,这应该没问题-尽管如文档所述,构造QSound
并称其play
方法为“可能……立即播放更多”,所以您还是想这样做。
如果您有此问题,解决方法是:
QSound(r"C:\directory\b1.mp3").play()
尽管在实际代码中,您可能希望保留大多数QSound
对象,而不是每次都重新创建它们。
在评论中,您说:
我发现QSound实际上不支持资源。 不幸的是,我不知道这意味着什么,也许您可以解释这对我的代码意味着什么。
这对您的代码没有任何意义,至少在今天没有。 您已将声音保存在常规文件中,并尝试通过绝对路径名访问这些文件。
但是,如果您想在将来改进您的应用程序,可能会遇到麻烦。
资源在Qt资源系统中进行了说明。 这个想法是,您没有一个单独的文件用于图像等文件,而是拥有一个可执行文件(例如MyApp.exe
,而所有资源文件都挤在了该可执行文件中。 在运行时,您仍然可以访问这些资源,就像它们仍然是单独的文件一样。 您只需使用诸如:/sounds/b1.mp3
类的特殊路径(或者更好的是,从路径名切换为URL,并使用诸如qrc:///sounds/b1.mp3
类的特殊URL)。
关键是那个“差不多”。 某些功能无法直接在资源上使用,因此,如果要使用这些功能,则必须将资源显式提取到临时文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.