如何在python中解决NameError

时间:2014-04-12 13:55:17

标签: python tkinter

我使用按钮点击调用一个功能。但它给了我错误:NameError: global name 'new' is not defined,即使我已将new定义为新窗口。

我的新窗口代码:

def result():
  root.withdraw()
  new = Toplevel()
  new.geometry("1105x605+300+300")

  button3 = Button(new, text='Select a Query Image',command = matching_image)
  button3.pack(padx = 1, pady = 1,anchor='ne')
  button3.place( x = 570, y = 60)  

该按钮将调用matching_image函数,代码为:

def matching_image():
  path1 = tkFileDialog.askopenfilename(filetypes=[("Image File",'.jpg')])
  im = Image.open(path1)
  resized = im.resize((200, 200),Image.ANTIALIAS)
  tkimage = ImageTk.PhotoImage(resized)
  myvar1 = Label(new,image = tkimage)
  myvar1.image = tkimage
  myvar1.pack()
  myvar1.place(x = 30, y = 100) 

这就是错误。错误消息如下:

%run "D:/6th sem/Major project/Code/frame.py"
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\HP\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.0.3.1262.win-x86\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\6th sem\Major project\Code\frame.py", line 194, in matching_image
myvar1 = Label(new,image = tkimage)

NameError: global name 'new' is not defined

任何建议!这样我就可以解决这个错误。

提前致谢:)

2 个答案:

答案 0 :(得分:1)

您的问题简化为:

def foo():
  var = 1

def bar():
  print var

foo()
bar()

你遇到的主要问题是'var'是本地的,而不是全局的。

此代码示例有效:

def foo():
  global var
  var = 1

def bar():
  print var

foo()
bar()

因为var被声明为全局变种。

答案 1 :(得分:1)

您在函数中定义了new,因此该变量仅存在于该函数的范围内。因此,当您尝试在另一个范围(这里是全局范围)中访问它时,您将获得NameError,因为它在该级别不可用。


您可以通过在您定义它的函数的开头执行global new来解决此问题。

此语句将其置于全局范围内,这意味着它在模块级别定义。因此,您可以在程序中的任何位置访问它,您将不会收到该错误。

像这样:

def result():
    global new
    new = Toplevel()
    # Other stuff.

虽然注意到做全局声明被认为是不好的做法。最好将代码放在class表单中,并将适用的变量分配给self