如何使用Tkinter'文件' Python中不同函数的变量?

时间:2014-11-15 01:00:56

标签: python python-2.7 tkinter

我正在使用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'变量?

1 个答案:

答案 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)