2012-05-07 105 views
0

我正在用Tkinter製作Python 2.6中的音樂播放器。這是我的代碼:如何從播放列表中播放歌曲

from Tkinter import * 
import mp3play 
import tkFileDialog 
import Tkinter 
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 Exit(): 
    exit() 
root = Tk() 
root.title("EmoPlayer") 
root.geometry('300x100+250+100') 
filename = Tkinter.StringVar() 
name = Tkinter.StringVar() 
play_list = Tkinter.StringVar() 
menubar = Menu(root) 
filemenu = Menu(menubar, tearoff=0) 
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 = 'Open file', command = open_file) 
open_file.grid(row=0, column=3) 
play_button = Button(root, width = 5, height = 1, text='Play', command = play) 
play_button.grid(row=0, column=0, sticky = W) 
stop_button = Button(root, width = 5, height = 1, text='Stop', command = stop) 
stop_button.grid(row=0, column=1, sticky = W) 
pause_button = Button(root, width = 5, height = 1, text='Pause', command = pause) 
pause_button.grid(row=0, column=2) 
volume_slider = Scale(root, label='Volume', orient = 'horizontal', fg = 'black', command = vol) 
volume_slider.grid(row=0, column=4) 
file_name_label = Label(root, font=('Verdana', 8), fg = 'black', wraplength = 300, textvariable=name) 
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, width = 50) 
play_list_display.pack() 

play_list_window.mainloop() 
root.mainloop() 

此代碼可以打開一個mp3文件,將其插入播放列表並播放它。但它不能通過從播放列表中選擇來播放歌曲。任何人都可以告訴我如何通過從播放列表中選擇工作嗎?

+0

你的縮進全都搞亂了你的問題。 –

+0

現在好嗎? – frivolous

+0

這兩個調用mainloop是不需要的。由於'play_list_window'以root爲父母,所以'play_list_window.mainloop()'調用'root.mainloop()'。因此,一旦主窗口關閉,您將離開'play_list_window.mainloop()',而第二次調用不起作用。 – FabienAndre

回答

1

您可以訂閱列表框中已更改的選項("<<ListboxSelect>>")或雙擊事件("<Double-Button-1>")。

請注意,您將不得不在某處存儲mp3文件的完整路徑(播放列表中顯示的文件名稱不足以播放它)。

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

play_list_display.bind("<Double-Button-1>", tune_changed) 
play_list_display.bind("<<ListboxSelect>>", tune_changed) 
+1

您可能想要對兩個事件做出不同的響應(由於多種原因(包括光標導航),所做的選擇更改)。儘管如此,這對於這類事情來說很重要。 –

+0

FabienAndre我試過這個,但現在它只是提到了python shell中歌曲的名稱,但是既沒有播放它也沒有更改播放器音頻欄上的名稱? – frivolous

+0

這裏是響應選擇事件的代碼,它取決於你插入的東西,以便它實際播放歌曲... – FabienAndre