0

简而言之,经过数小时寻找在 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()
4

1 回答 1

4

您可能会遇到两个不同的问题。


首先,如果您想使用 Windows 样式的路径名,您需要使用原始字符串或反斜杠转义。在常规字符串中,\b是单个退格字符,而不是 a\后跟 a b。换句话说,当您真正想要播放文件时,您正在尝试播放文件“C:\directory\x081.mp3” C:\\directory\\b1.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()实例(插槽)方法。在以后的版本中,这应该没问题——尽管,正如文档所说,构造 aQSound并调用它的play方法“可能……更直接地播放”,所以你可能还是想这样做。

如果您遇到此问题,解决方法是:

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

尽管在实际代码中,您可能希望保留大部分QSound对象,而不是每次都重新创建它们。


在评论中,你说:

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

这对您的代码没有任何意义,至少今天没有。您已将声音保存在常规文件中,并且您正尝试通过绝对路径名访问这些文件。

但是如果你想在未来改进你的应用程序,它可能会成为阻碍。

资源在Qt 资源系统中进行了解释。这个想法是,您只需一个可执行文件(如 ),而不是拥有一堆单独的图像文件等文件MyApp.exe,所有资源文件都塞入该可执行文件中。在运行时,您仍然可以访问这些资源,就好像它们仍然是单独的文件一样。您只需使用特殊的路径,例如:/sounds/b1.mp3(或者,更好的是,从路径名切换到 URL,并使用特殊的 URL,例如qrc:///sounds/b1.mp3)。

踢球者是“几乎”。一些特性不能直接作用于资源,因此如果你想使用这些特性,你必须显式地将资源提取到一个临时文件中。

于 2013-04-01T20:10:13.620 回答