2012-06-17 277 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文件具有写入许可。