NameError:未定义名称“top”

时间:2016-03-21 16:50:26

标签: python tkinter nameerror

我正在尝试使用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

3 个答案:

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