我使用按钮点击调用一个功能。但它给了我错误: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
任何建议!这样我就可以解决这个错误。
提前致谢:)
答案 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
。