【问题标题】:NameError: name 'top' is not definedNameError:名称“顶部”未定义
【发布时间】:2016-03-21 16:50:26
【问题描述】:

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

【问题讨论】:

    标签: python tkinter nameerror


    【解决方案1】:

    你只在main中定义了top,而不是在全局范围内,即使是在全局范围内,也是在make_button之后定义的; Python 中的默认参数在定义时评估一次,而不是在调用时查找。

    最好的方法可能是将大部分函数变成类方法,并让类本身创建一个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被执行,就没有top全局定义,所以你的代码只能作为主程序使用,而不是作为一个没有很多hackery的可导入模块。

    【讨论】:

      【解决方案2】:

      您指的是make_button 参数列表中的顶部-您说side=top,但实际上并没有在该函数之前定义top。没有全局称为 top。

      在定义之前,您不能将其设置为参数的默认值。

      【讨论】:

      • 但是,top 是在 tkinter 中定义的,我已经导入了 tkinter
      • @daiyue:是吗?在 Python 3.5 终端中,我刚刚做了>>> import tkinter>>> tkinter.top,它给出了AttributeError
      • 我不认为它在我的发行版中 - 尝试从 tkinter import top 输入您的解释器,我认为它会失败。您在 main 函数中定义 top ,但它在本地范围内 - 即它只能与函数一起使用。
      【解决方案3】:

      我也遇到了同样的错误,但我意识到,我需要为“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()
      

      【讨论】:

        【解决方案4】:

        如果你像这样导入 tkinter:import tkinter as tk 那么这个包就是 test.pack(tk.TOP)

        如果你像这样导入 tkinter:from tkinter import * 然后就是 test.pack(TOP)

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 2021-04-15
        • 2019-01-26
        • 2021-10-05
        • 2017-08-16
        • 2019-08-18
        相关资源
        最近更新 更多