2015-04-22 33 views
1

我周围搜索,并找到了很多方法如何通过从直接链接打开文件分配一个文件到一个变量,但我想知道如何分配一个文件到一个变量读取功能,当用户使用文件对话框打开文件(例如文件>打开>用户选择的文件)?Python:使用打开的文件对话框将文件分配给变量?

我试图打开要传递到pyglet.media.load(variable containing file)的音乐文件。

它会返回错误:NameError: f is not defined

from tkinter import * 
from tkinter.filedialog import askopenfilename 
import pyglet 
from threading import Thread 

app = Tk() 
app.title("Music Player") 
app.geometry("600x200") 
have_avbin = True 

def openFile(): 
    song = filedialog.askopenfilename(filetypes = (("MP3 files", "*.mp3"),("All files","*.*"))) 
    f = song 
    return f 



#Creates menu bar for opening MP3s, and closing the program 
menu = Menu(app) 
file = Menu(menu) 
file.add_command(label='Open', command= openFile) # replace 'print' with the name of your open function 
file.add_command(label='Exit', command=app.destroy) # closes the tkinter window, ending the app 
menu.add_cascade(label='File', menu=file) 
app.config(menu=menu) 

#Run each app library mainloop in different python thread to prevent freezing 
def playMusic(): 
    global player_thread 
    player_thread = Thread(target=real_playMusic) 
    player_thread.start() 

def stopMusic(): 
    global player_thread 
    player_thread = Thread(target=real_stopMusic) 
    player_thread.start() 

#Play open file function attached to button 
def real_playMusic(): 
    music = pyglet.media.load(f); 
    music.play() 
    pyglet.app.run() 

#Stop the music function 
def real_stopMusic(): 
    pyglet.app.exit() 




#Play button creation 
btnPlay = Button(app, text ="Play", command = playMusic) 
btnPlay.grid() 


#Pause button creation 
btnPause = Button(app) 
btnPause.grid() 
btnPause.configure(text = "Stop", command = stopMusic) 



app.mainloop() # keep at the end 
+0

你需要做一些研究[功能](https://docs.python.org/3.4/tutorial/controlflow.html#defining-函数) - 具体来说,变量作用域和“返回”是如何工作的。 – TigerhawkT3

回答

1
have_avbin = True 
f='' # initialize this variable 

def openFile(): 
    global f # tell the function that we plan on modifying this global variable 
    f = filedialog.askopenfilename(filetypes = (("MP3 files", "*.mp3"),("All files","*.*"))) 
+0

谢谢你的帮助! –