在分配之前引用 - tkinter

时间:2016-11-28 19:38:59

标签: python tkinter

当我点击“获取”按钮时,我不确定为什么会收到错误消息。我已经移动了一些东西,但仍然收到此错误消息。

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()

2 个答案:

答案 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函数。