为了保持简短,经过几个小时寻找在 pyqt4 中播放声音的方法,我仍然无法弄清楚为什么这个简单的小代码不起作用?我没有收到任何错误信息,但没有声音(我试过 mp3,ogg 和 wav)我只是得到一个小窗口“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()
1 回答
你可能在这里有两个不同的问题。
首先,如果要使用 Windows-style 路径名,则需要使用原始字符串或反斜杠转义符。在常规字符串中,
\b
是单个退格字符,而不是\
后跟b
。换句话说,当你真的想播放文件C:\\directory\\b1.mp3
时,你正试图播放文件'C: directoryx081.mp3'。有关详细信息,请参阅文档中的字符串和字节文字。您可以尝试记住所有特殊的 backslash-escape 字符,但更简单的解决方案是始终逃避所有反斜杠。或者,更简单的是,对所有 Windows-style 路径名使用原始字符串。或者,甚至更简单,如果您使用的功能甚至在 Windows 上允许 POSIX-style 路径名,只需使用它们即可。换句话说,以下之一:
最重要的是,如果您使用的是较旧版本的 PyQt,则不能以这种方式调用静态 Qt 方法。换句话说,您不是调用
QSound::play(filename)
静态方法,而是调用QSound::play()
实例(插槽)方法。在以后的版本中,这应该没问题 - 尽管正如文档所说,构建QSound
并调用其play
方法“可能......立即播放”,所以无论如何你可能想要这样做。如果您遇到此问题,解决方法是:
虽然在实际代码中,您可能希望每次都保留大部分
QSound
对象而不是 re-creating 对象。在评论中,你说:
它对你的代码没有任何意义,至少今天没有。您已经在常规文件中获得了声音,并且您尝试通过绝对路径名访问这些文件。
但是如果你想在将来改进你的应用程序,它可能会妨碍你。
资源在Qt 资源系统中解释。我们的想法是,您只需拥有一个像
MyApp.exe
这样的可执行文件,而不是为图像等提供一堆独立的文件,并将所有资源文件塞进该可执行文件中。在运行时,您仍然可以访问这些资源,就像它们仍然是单独的文件一样。您只需使用:/sounds/b1.mp3
之类的特殊路径(或者,更好的是,从路径名切换到 URL,并使用特殊的 URL,如qrc:///sounds/b1.mp3
)。踢球者是“差不多”。一些功能无法直接在资源上运行,因此如果要使用这些功能,则必须将资源显式提取到临时文件。