2013-04-01 43 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實際上不支持資源。不幸的是,我不知道這意味着什麼,也許你可以解釋我的代碼意味着什麼。 –