2012-06-17 88 views
2

我犯了一個音樂播放器,播放列表,但因爲只有首歌的名字在播放列表不是一個完整的MP3文件將在播放列表中的歌曲無法播放。你能告訴我如何處理這個問題嗎? 這裏是我的代碼:音樂播放器的播放列表

from Tkinter import * 
import mp3play 
import tkFileDialog 
import Tkinter 
import tkFont 
import Tkinter as tk 
#from PIL import ImageTk,Image 

def open_file():        #Opens a dialog box to open .mp3 file 
    global music        #then sends filename to file_name_label. 
    global mp3 
    global play_list 
    filename.set (tkFileDialog.askopenfilename(defaultextension = ".mp3", filetypes=[("All Types", ".*"), ("MP3", ".mp3")])) 
    playlist = filename.get() 
    playlist_pieces = playlist.split("/") 
    play_list.set (playlist_pieces[-1]) 
    playl = play_list.get() 
    play_list_display.insert(END, playl) 
    mp3 = filename.get() 
    print mp3 
    music = mp3play.load(mp3) 
    pieces = mp3.split("/") 
    name.set (pieces[-1]) 

def play():          #Plays the .mp3 file 
    music.play() 

def stop():          #Stops the .mp3 file 
    music.stop()     

def pause():         #Pauses or unpauses the .mp3 file 
    if music.ispaused() == True: 
     music.unpause() 
    elif music.ispaused() == False: 
     music.pause() 

def vol(event):         #Allows volume to be changed with the slider 
    v = Scale.get(volume_slider) 
    music.volume(v) 

def tune_changed(event): 
    idx = event.widget.curselection()[0] 
    print ("Now playing %s" % event.widget.get(idx)) 

def Exit(): 
    exit() 

root = tk.Tk() 
root.title("EmoPlayer") 

root.configure(background='black') 

#root = Tk() 

root.geometry('300x100+750+300') 

filename = Tkinter.StringVar() 
name = Tkinter.StringVar() 
play_list = Tkinter.StringVar() 
menubar = Menu(root) 
filemenu = Menu(menubar, tearoff=0, bg="black", fg="Orange") 
menubar.add_cascade(label='File', menu = filemenu) 
filemenu.add_command(label='Open', command = open_file) 
filemenu.add_separator() 
filemenu.add_command(label='Exit', command = Exit) 
root.config(menu=menubar) 
open_file = Button(root, width = 6, height = 1, text = 'Mood',fg='Orange', bg='black') 
open_file.grid(row=0, column=3) 
play_button = Button(root, width = 5, height = 1, text='Play', fg='Orange', command = play, bg="black") 
play_button.grid(row=0, column=0, sticky = W) 
stop_button = Button(root, width = 5, height = 1, text='Stop',fg='Orange', command = stop, bg="black") 
stop_button.grid(row=0, column=1, sticky = W) 
pause_button = Button(root, width = 5, height = 1, text='Pause',fg='Orange', command = pause, bg="black") 
pause_button.grid(row=0, column=2) 
volume_slider = Scale(root, label='Volume', orient = 'horizontal', fg = 'Orange', command = vol, bg="black") 
volume_slider.grid(row=0, column=4) 
file_name_label = Label(root, font=('Comic Sans', 8), fg = 'Orange', wraplength = 300, textvariable=name, bg="black") 
file_name_label.grid(row=3, column=0, columnspan=8) 

play_list_window = Toplevel(root, height = 150, width = 100) 
play_list_window.title("Playlist") 
play_list_display = Listbox(play_list_window, selectmode=EXTENDED, width = 50, bg="Dark Slate grey", fg="Orange") 
play_list_display.bind("<Double-Button-1>", tune_changed) 

play_list_display.pack() 

play_list_window.mainloop() 



root.mainloop() 

回答

3

我看看你的代碼,因爲我還沒有和mp3play前工作,覺得很有意思。

這是我改變了:

  1. 我把你的代碼在一個類中,這樣更容易和更清潔的方法之間共享變量。這也消除了與global混亂的需要。通常清理一下代碼,例如,分解過長的行。儘管如此,我試圖不改變你的代碼。
  2. 增加了trackLocations列表,保持實際的文件路徑。
  3. 添加加載上雙擊新文件在播放列表中

這是結果的線,我希望它能幫助:

from Tkinter import * 
import mp3play 
import tkFileDialog 
import Tkinter 
import tkFont 
import Tkinter as tk 

class musicplay: 
    def __init__(self): 
     self.music = None 
     self.play_list = [] 
     self.trackLocations = [] 

     self.root = tk.Tk() 
     self.root.title("EmoPlayer") 

     self.root.configure(background='black') 
     self.root.geometry('300x100+750+300') 

     self.filename = Tkinter.StringVar() 
     self.name = Tkinter.StringVar() 
     self.play_list = Tkinter.StringVar() 

     menubar = Menu(self.root) 
     filemenu = Menu(menubar, tearoff=0, bg="black", fg="Orange") 
     menubar.add_cascade(label='File', menu = filemenu) 
     filemenu.add_command(label='Open', command = self.open_file) 
     filemenu.add_separator() 
     filemenu.add_command(label='Exit', command = self.Exit) 
     self.root.config(menu=menubar) 

     open_file = Button(self.root, width = 6, height = 1, 
          text = 'Mood',fg='Orange', bg='black') 
     open_file.grid(row=0, column=3) 

     play_button = Button(self.root, width = 5, height = 1, text='Play', 
          fg='Orange', command = self.play, bg="black") 
     play_button.grid(row=0, column=0, sticky = W) 

     stop_button = Button(self.root, width = 5, height = 1, text='Stop', 
          fg='Orange', command = self.stop, bg="black") 
     stop_button.grid(row=0, column=1, sticky = W) 

     pause_button = Button(self.root, width = 5, height = 1, text='Pause', 
           fg='Orange', command = self.pause, bg="black") 
     pause_button.grid(row=0, column=2) 

     self.volume_slider = Scale(self.root, label='Volume', 
           orient = 'horizontal', fg = 'Orange', 
           command = self.vol, bg="black") 
     self.volume_slider.grid(row=0, column=4) 

     file_name_label = Label(self.root, font=('Comic Sans', 8), 
           fg = 'Orange', wraplength = 300, 
           textvariable=self.name, bg="black") 
     file_name_label.grid(row=3, column=0, columnspan=8) 

     play_list_window = Toplevel(self.root, height = 150, width = 100) 
     play_list_window.title("Playlist") 
     self.play_list_display = Listbox(play_list_window, selectmode=EXTENDED, 
            width = 50, bg="Dark Slate grey", 
            fg="Orange") 
     self.play_list_display.bind("<Double-Button-1>", self.tune_changed) 
     self.play_list_display.pack() 
     play_list_window.mainloop() 

     self.root.mainloop()   

    def open_file(self):         
     """ 
     Opens a dialog box to open .mp3 filemusic, 
     then sends filename to file_name_label. 
     """ 
     self.filename.set(tkFileDialog.askopenfilename(
      defaultextension = ".mp3", 
      filetypes=[("All Types", ".*"), ("MP3", ".mp3")])) 
     self.playlist = self.filename.get() 
     playlist_pieces = self.playlist.split("/") 
     self.play_list.set (playlist_pieces[-1]) 
     playl = self.play_list.get() 
     self.play_list_display.insert(END, playl) 
     print self.filename.get() 
     self.music = mp3play.load(self.filename.get()) 
     pieces = self.filename.get().split("/") 
     self.trackLocations += [self.filename.get()] 
     self.name.set(pieces[-1]) 

    def play(self): 
     """Plays the .mp3 file""" 
     self.music.play() 

    def stop(self): 
     """Stops the .mp3 file""" 
     self.music.stop()     

    def pause(self): 
     """Pauses or unpauses the .mp3 file""" 
     if self.music.ispaused(): 
      self.music.unpause() 
     else: 
      self.music.pause() 

    def vol(self, event): 
     """Allows volume to be changed with the slider""" 
     v = Scale.get(self.volume_slider) 
     try: 
      self.music.volume(v) 
     except: 
      pass 

    def tune_changed(self, event): 
     idx = event.widget.curselection()[0] 
     self.music = mp3play.load(self.trackLocations[int(idx)]) 
     print ("Now playing %s" % event.widget.get(idx)) 

    def Exit(self): 
     exit() 

if __name__ == "__main__": 
    musicplay() 
+0

感謝ü這麼多..它幫助 我要問,什麼是「自我」的目的。爲什麼你在每一行中都使用它? 和是否有可能將這些MP3文件路徑,這是在播放列表中,在數組?? ??以及如何做到這一點? – frivolous

+0

我也做過保存播放列表。這個播放器播放幾乎所有的歌曲,但播放幾首歌曲時,它給了我這個錯誤:ValueError:對於基數爲10的int()無效文字:'指定的設備未打開或未被MCI識別。 ...現在我無法理解這個錯誤。 – frivolous

0

ValueError異常:無效的字面INT()與基地10:'指定的設備未打開或未被MCI識別。'

我也與此錯誤掙扎長谷歌搜索我在德國的一些論壇上發現了一些C++的人誰說,這是因爲ID3v2標籤與女巫MCI有問題的帖子後。

然後我使用mutagen - Python多媒體標記庫,在播放它之前從mp3中去掉標記,因爲那時我再也沒有遇到過這個錯誤。同樣,如果訴諸誘變劑,確保在剝離其標籤之前,mp3文件具有寫入許可。