2016-03-21 2 views
-1

Я пытаюсь использовать Tkinter для создания графического интерфейса пользователя, код: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

Вы определяете только top в main, а не в глобальном масштабе, и даже если это было в глобальном масштабе, вы определили его после 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 глобального определения, поэтому ваш код можно использовать только в качестве основной программы, а не как импортируемый модуль без большого количества хакеров.

1

вы имеете в виду первое место в списке make_button параметра - где вы говорите side=top, но на самом деле не определен top до этой функции. Существует глобальное название top.

Вы не можете установить его как значение по умолчанию для параметра, пока оно не определено.

+0

но, верхняя часть определена в tkinter, и я импортировал tkinter – daiyue

+1

@ daiyue: Это? В терминале Python 3.5 я просто сделал '>>> import tkinter',' >>> tkinter.top' и дал атрибут AttributeError. – ShadowRanger

+1

Я не думаю, что это в моем дистрибутиве - попробуйте ввести из 'tkinter import top' в ваш интерпретатор, и я думаю, что он потерпит неудачу. Вы определяете верхнюю часть своей основной функции, но она находится в локальной области, то есть она может использоваться только с функцией. – srowland

Смежные вопросы