我正在尝试使用Tkinter创建GUI,代码为:
from tkinter import *
class LoginFrame(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
# initialize the login screen UI
def initUI(self):
self.parent.title("Login Screen")
# create a menu bar
menubar = Menu(top)
# create a help menu
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About", command=about)
menubar.add_cascade(label="Help", menu=helpmenu)
# display the menu
self.parent.config(menu=menubar)
#----------------------------------------------------------------------
def about():
"""about info"""
print("This is a Tkinter demo")
# create a button
#----------------------------------------------------------------------
def make_button(parent, command, caption=NONE, side=top, width=0, **options): # name error 'top' is not defined
"""make a button"""
btn = Button(parent, text=caption, command=command)
if side != top:
btn.pack(side=side)
else:
btn.pack()
return btn
def main():
top = Tk()
# Set up login frame properties
top.title("Login Screen")
# create a login button
login_btn = make_button(top, about, "Login")
top.mainloop()
if __name__ == '__main__':
main()
我试着运行代码,python给了我以下错误:
builtins.NameError: name 'top' is not defined
答案 0 :(得分:1)
您指的是make_button
参数列表中的顶部 - 您说side=top
,但在该函数之前尚未实际定义top
。没有全球名为top。
在定义参数之前,不能将其设置为参数的默认值。
答案 1 :(得分:1)
您只在TRUSTWORTHY ON
中定义top
,而不是在全局范围内,即使它在全球范围内,您也可以在main
之后定义它; Python中的默认参数在定义时被评估一次,而不是在调用时查找。
最好的方法可能是将大部分函数转换为类方法,并让类本身创建make_button
属性。
但就目前而言,你可以做一个极简主义的改变:
top
请注意,这仍然不是很好的代码;如果没有# Use None as a default at definition time, since top doesn't exist yet
def make_button(parent, command, caption=NONE, side=None, width=0, **options):
"""make a button"""
if side is None: # Convert None to top at call time
side = top
btn = Button(parent, text=caption, command=command)
if side is not top: # Minor tweak: Use identity test over equality
btn.pack(side=side)
else:
btn.pack()
return btn
def main():
global top # Make top a global then define it
top = Tk()
... rest of main ...
被执行,则没有main
全局定义,所以你的代码只能作为主程序使用,而不是没有大量hackery的可导入模块。
答案 2 :(得分:0)
我也遇到同样的错误,但是我意识到,我需要将大写字母用于“ TOP”而不是“ Top”,在使用大写字母之后,它对我有用。
frame = Frame(root)
frame.pack()
root.title("Calcu_Displayframe")
num_1=StringVar()
topframe = Frame(root)
topframe.pack(side=TOP)
txtDisplay=Entry(frame, textvariable=num_1, bd=20, insertwidth=1, font=30)
txtDisplay.pack(side=TOP)
root.mainloop()