2015-03-13 72 views
0

我怎样才能使用winsound.PlaySound()函数来播放存储的变量而不是特定的声音?我正在制作一个临时音乐播放器,我希望能够简单地播放用户选择的歌曲。这是我目前的代码。WinSound从变量播放声音?

import Tkinter, Tkconstants, tkFileDialog 
import winsound 
from Tkconstants import * 
from tkFileDialog import * 
from PIL import Image, ImageTk 

class MusicPlayer(Tkinter.Frame): 

    def __init__(self, root): 

    Tkinter.Frame.__init__(self, root) 


    # options for buttons 
    button_opt = {'fill': Tkconstants.BOTH, 'padx': 5, 'pady': 5} 

    #options for images 

    # define image 
    img = Image.open('musicPlayer.PNG') 
    bg = ImageTk.PhotoImage(img) 
    label = Tkinter.Label(image=bg) 
    label.image = bg 
    label.pack() 

    # define buttons 
    but1 = Tkinter.Button(self, text='Play', command=self.play) 
    but2 = Tkinter.Button(self, text='Stop', command=self.stop) 
    but1.grid(sticky="S, W, E", column=1) 
    but1.grid(sticky="S, W, E", column=1) 

    # define options for opening or saving a file 
    self.file_opt = options = {} 
    options['defaultextension'] = '*.wav' 
    options['filetypes'] = [('WAV Sound Files', '*.wav')] 
    options['initialdir'] = 'C:\\' 
    options['initialfile'] = '.wav' 
    options['parent'] = root 
    options['title'] = 'Pick a File' 

    # This is only available on the Macintosh, and only when Navigation Services are installed. 
    #options['message'] = 'message' 

    # if you use the multiple file version of the module functions this option is set automatically. 
    #options['multiple'] = 1 

    # defining options for opening a directory 
    self.dir_opt = options = {} 
    options['initialdir'] = 'C:\\' 
    options['mustexist'] = False 
    options['parent'] = root 
    options['title'] = 'Pick a Dir' 

    def askopenfile(self): 

    return tkFileDialog.askopenfile(mode='r', **self.file_opt) 

    def askopenfilename(self): 

    # get filename 
    filename = tkFileDialog.askopenfilename(**self.file_opt) 

    # open file on your own 
    if filename: 
     return open(filename, 'r') 
     print filename 

    def asksaveasfile(self): 

    return tkFileDialog.asksaveasfile(mode='w', **self.file_opt) 

    def asksaveasfilename(self): 

    # get filename 
    filename = tkFileDialog.asksaveasfilename(**self.file_opt) 

    # open file on your own 
    if filename: 
     return open(filename, 'w') 

    def askdirectory(self): 

    return tkFileDialog.askdirectory(**self.dir_opt) 

    def play(self): 
    soundfile = self.askopenfilename() 

    winsound.PlaySound(soundfile, winsound.SND_FILENAME) 

    def stop(self): 
    winsound.PlaySound(None, winsound.SND_PURGE) 

if __name__=='__main__': 
    root = Tkinter.Tk() 
    root.iconbitmap(r'C:\Python27\DLLs\musicPlayer.ico') 
    MusicPlayer(root).pack() 
    root.wm_title('Music Player') 
    root.mainloop() 

要注意的事情

  • 我是新来的广州市运生插件,以及Python本身,我不知道这标志我应该使用。

错误,我得到

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1532, in __call__ 
    return self.func(*args) 
    File "C:\Users\Brenneman.Josh.19\Downloads\code (2)\MusicPlayer.py", line 88, in play 
    winsound.PlaySound(soundfile, winsound.SND_FILENAME) 
TypeError: must be string or read-only buffer, not file 
+0

你要完成什么改变?你想读取每首歌曲文件并将其存储在程序中的一个变量中,而不是简单地按名称获取每个文件来播放它?我没有看到你要求一个文件名,然后将该字符串传递给PlaySound()的方式有什么问题。 – TigerhawkT3 2015-03-13 19:36:11

+0

@ TigerhawkT3它给了我一个关于它不是一个有效的路径或字符串或类似的错误。我将用错误编辑帖子。 – 2015-03-23 15:17:22

+0

您定义了自己的'askopenfilename',它返回与您定义的'askopenfile'相同的东西:一个文件对象。正如回溯说的那样,'winsound.PlaySound()'需要一个带有声音文件路径的字符串,例如''声音/ mysound.wav',而不是一个打开的文件对象。只需直接使用'tkFileDialog'函数,而不是将它们包装到自己的函数中。你的asksaveasfilename函数可以工作吗? – TigerhawkT3 2015-03-23 18:36:07

回答

2

winsoundPlaySound()需要传递的文件名和一个或多个标志的字符串。我建议使用SND_ASYNC标志,它会播放声音并立即返回。使用以下内容:

winsound.PlaySound('C:/Windows/Media/chimes.wav', winsound.SND_ASYNC)