我正在使用Python 2.7。我也使用一个名为id3reader的库来从mp3文件中获取元数据。如果我使用此代码:
import tkFileDialog
import id3reader
file = tkFileDialog.askopenfile()
id3r = id3reader.Reader(file)
print(id3r.getValue('performer')
一切正常,歌曲名称的艺术家将在控制台中打印出来。
但是,我试图在不同的功能中做到这一点。所以如果我使用这段代码:
import tkFileDialog
import id3reader
def Load(self):
file = tkFileDialog.askopenfile()
def Display(self):
id3r = id3reader.Reader(file)
print(id3r.getValue('performer')
我收到来自id3reader脚本的错误。如果我使用:
self.file
或
fileName = file
global fileName
我得到一个未定义错误的全局变量。
我如何能够在不同的函数中使用内置的'file'变量?
答案 0 :(得分:1)
你混淆了许多不同的东西。
首先,内置file
变量是文件对象的实际类型。您不想使用它,而是尝试使用从askopenfile()
返回的文件名隐藏它。
并且file
不是Tkinter变量 - 既不是内置的,也不是你创建的那个,与Tkinter有关。
您的代码不起作用的原因是,在Load
函数内,当您编写file = tkFileDialog.askopenfile()
时,您正在创建一个局部变量。该局部变量隐藏了同名全局变量的名称,直到该函数退出,此时它就会消失。
您尝试使用self.file
是一个很好的解决方案 - 除了您没有任何课程。如果你想了解如何使用一般的类,以及特别是在Tkinter中使用它们的惯用方法,这是一件很棒的事情,但是在StackOverflow的答案中教授它太多了,并且Python已经提供了一个很棒的教程。
如果你想使用全局变量,你可以这样做,但是(a)你必须使用global file
,而不是global fileName
,如果你想file
是全局的, (b)你必须将放在Load
函数中,而不是在顶层。如果您同时执行这两项操作,那么file = tkFileDialog.askopenfile()
现在将重新分配全局变量file
,而不是将其隐藏在本地变量中,因此一旦您完成,该值仍然可用,到任何其他想要访问它的函数。
但是,更好的解决方案是不要尝试共享全局变量。只需return
该值,并让调用者按住它并将其传递给Display
。由于我无法看到您用来调用这些功能的代码,因此我必须做出一些建议,但希望您能够理解它并将其应用到您自己的代码中:
def Load():
return tkFileDialog.askopenfile()
def Display(file):
id3r = id3reader.Reader(file)
print(id3r.getValue('performer')
f = Load()
Display(f)