2016-03-21 22 views
-1
Ben bir GUI oluşturmak için Tkinter kullanmaya çalışıyorum

olan adı 'üst' tanımlanmadı:NameError:, kod

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

Ben, kod çalıştırmasına çalıştı piton bana şu hatayı verdi:

builtins.NameError: name 'top' is not defined 

cevap

1

Yalnızca değil küresel kapsamda, main yılında top tanımlamak ve küresel kapsamı idi bile, make_button sonra tanımlanan; Python'daki varsayılan argümanlar, tanımlanma zamanında, çağrı zamanında değil, bir kez değerlendirilir.

En iyi yaklaşım, işlevlerinizin çoğunu sınıf yöntemleri haline getirmek ve sınıfın kendisinin bir top özniteliği oluşturmasıdır.

Ama zaman varlık için, bir minimalist değişiklik yapabileceği

: Bu hala büyük bir kod olduğunu

# 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 ... 

Not; main olmadan, global olarak tanımlanmış top yoktur, bu nedenle kodunuz çok sayıda korsanlığa sahip olmayan bir ithal modül olarak değil, ana program olarak kullanılabilir.

1

sen make_button parametre listesinde üst kastediyoruz - Eğer side=top demek, ama aslında o fonksiyonun önce top tanımlamadınız. Küresel olarak adlandırılan bir top yok.

Tanımlanana kadar bir parametre için varsayılan değer olarak ayarlayamazsınız.

+0

Ancak, top üstte tanımlanmış ve ben – daiyue

+1

@ daiyue tkinter ithal ettik: Bu? Bir Python 3.5 terminalinde, sadece >>>>> tinkter.top 'import tkinter 'yaptım ve bir' AttributeError' verdi. – ShadowRanger

+1

Bunun dağıtımımın içinde olduğunu sanmıyorum - “tkinter import top” dan çevirmene yazmayı deneyin ve bunun başarısız olacağını düşünüyorum. Ana fonksiyonunuzda en üst noktayı tanımlamaktasınız, fakat buradaki yerel kapsamdadır - yani sadece fonksiyon ile kullanılabilir. – srowland

İlgili konular