2016-03-21 68 views
-1

我想使用Tkinter的創建GUI,代碼:NameError:名字「頂」沒有定義

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

我試圖運行代碼,蟒蛇給了我以下錯誤:

builtins.NameError: name 'top' is not defined 

回答

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的可導入模塊。

1

您在參考make_button參數列表中的頂部 - 您說side=top,但實際上在該函數之前沒有定義top。沒有全球稱爲頂級。

在定義之前,您無法將其設置爲參數的默認值。

+0

但是,頂部是在tkinter中定義的,我已經導入tkinter – daiyue

+1

@daiyue:是嗎?在Python 3.5終端中,我只是做了'import tkinter','>>> tkinter.top',並且給了一個'AttributeError'。 – ShadowRanger

+1

我不認爲這是在我的發行版中 - 嘗試從'tkinter import top'輸入到您的解釋器中,我認爲它會失敗。您正在定義主函數中的top,但它在本地範圍內 - 即它只能用於該函數。 – srowland

相關問題