当我点击“获取”按钮时,我不确定为什么会收到错误消息。我已经移动了一些东西,但仍然收到此错误消息。
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
return self.func(*args)
File "address.py", line 5, in getName
first_name = first_name.get()
UnboundLocalError: local variable 'first_name' referenced before assignment
代码:
from tkinter import *
from tkinter import ttk
def getName(event):
first_name = first_name.get()
fieldEntry.insert(0, first_name)
root = Tk()
root.title('Address Book')
Label(root, text='First Name').grid(row=0, sticky=W, padx=4)
first_name = Entry(root).grid(row=0, column=1, sticky=E, pady=4)
Label(root, text='Last Name').grid(row=1, sticky=W, padx=4)
last_name = Entry(root).grid(row=1, column=1, sticky=E, pady=4)
#Button(root, text='Submit').grid(row=3)
getNameButton = Button(root, text='Get')
getNameButton.bind('<Button-1>', getName)
getNameButton.grid(row=3, column=1, sticky=E)
fieldEntry = Entry(root)
fieldEntry.grid(row=4, column=1, sticky=E)
root.mainloop()
答案 0 :(得分:2)
你有两个问题。当你写:
first_name = first_name.get()
Python在赋值的左侧看到first_name
,并假设fist_name
是局部变量。然后当它运行时,当它查找first_name
(在右侧)时,它只会查看函数的本地人。由于本地first_name
尚未填充在本地命名空间中,因此它会引发UnboundLocalError
。我建议更改全局名称:
first_name_entry = Entry(root)
first_name_entry.grid(row=0, column=1, sticky=E, pady=4)
请注意,为了解决第二个问题,我将条目创建与网格化分开。原因是Widget.grid
返回None
,这意味着(在您的处理代码中),first_name
之前是None
,而不是您期望的条目。
这是一个适用于我的计算机的完整脚本:
from tkinter import *
from tkinter import ttk
def getName(event):
first_name = first_name_entry.get()
fieldEntry.insert(0, first_name)
root = Tk()
root.title('Address Book')
Label(root, text='First Name').grid(row=0, sticky=W, padx=4)
first_name_entry = Entry(root)
first_name_entry.grid(row=0, column=1, sticky=E, pady=4)
Label(root, text='Last Name').grid(row=1, sticky=W, padx=4)
last_name = Entry(root).grid(row=1, column=1, sticky=E, pady=4)
#Button(root, text='Submit').grid(row=3)
getNameButton = Button(root, text='Get')
getNameButton.bind('<Button-1>', getName)
getNameButton.grid(row=3, column=1, sticky=E)
fieldEntry = Entry(root)
fieldEntry.grid(row=4, column=1, sticky=E)
root.mainloop()
答案 1 :(得分:0)
您在稍后在程序中定义之前的函数中引用first_name
。您必须在first_name
函数之前定义getName()
。您还可以在定义getName()
后放置first_name
函数。