2014-11-25 3 views
0

첫 번째 tkinter 앱을 실행하려고하는데 다음과 같이 오류가 발생합니다. '프레임'이 같은 클래스의 함수에 표시되지 않는 이유는 무엇입니까? 아래다음 Tkinter 프로그램에 어떤 문제가 있습니까?

Traceback (most recent call last): 
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 25, in <module> 
myapp = App(root) 
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 7, in __init__ 
self.createWidgets() 
File "C:\Data\Personal\Python\Tkinter\GUI_ver1.py", line 10, in createWidgets 
self.button = Button(frame, text="QUIT", fg="red", command=frame.quit) 
NameError: global name 'frame' is not defined 

내 프로그램 :

from Tkinter import * 

class App(Frame): 
    def __init__(self, master=None): 
     frame = Frame(master) 
     frame.pack() 
     self.createWidgets() 

    def createWidgets(self): 
     self.button = Button(frame, text="QUIT", fg="red", command=frame.quit) 
     self.button.pack(side=LEFT) 

     self.hi_there = Button(frame, text="Hello", command=self.say_hi) 
     self.hi_there.pack(side=LEFT) 

     self.hi_there.pack({"side": "right"}) 

    def say_hi(self): 
     print "hi there, everyone!" 

root = Tk() 
# create the application 
myapp = App(root) 

myapp.master.title("My First App") 
myapp.master.geometry('450x130') 
myapp.master.resizable(0,0) 

# start the program 
root.mainloop() 

답변

3
def __init__(self, master=None): 
    frame = Frame(master) 
    frame.pack() 
    self.createWidgets() 

frame 당신이 __init__에 정의 된 다른 방법에 표시되지 않습니다. 액세스 할 수 있으려면 self의 속성으로 지정해야합니다.

def __init__(self, master=None): 
    self.frame = Frame(master) 
    self.frame.pack() 
    self.createWidgets() 

변수를 사용할 때마다 self.을 포함해야합니다. 나가서 설명하자면 NameError를 해결하는 가장 쉬운 방법이지만 코드가 여전히 AttributeError: App instance has no attribute 'master' 오류가 충돌합니다

def createWidgets(self): 
    self.button = Button(self.frame, text="QUIT", fg="red", command=self.frame.quit) 
    self.button.pack(side=LEFT) 

    self.hi_there = Button(self.frame, text="Hello", command=self.say_hi) 
    self.hi_there.pack(side=LEFT) 

. AppFrame의 하위 클래스로 만들었지 만 Frame 이니셜 라이저를 호출하지 않으므로 프레임 메서드를 호출 할 때 혼동을 일으킬 수 있습니다. __init__으로 전화하십시오.

def __init__(self, master=None): 
    Frame.__init__(self, master) 
    frame = Frame(master) 
    frame.pack() 
    self.createWidgets() 
마지막 추가로

, 당신의 코드가 제대로 작동해야하지만 필요 이상 그것은 조금 더 복잡합니다. App 인스턴스는 프레임이지만 자체 내에 프레임이 포함되어 있습니다 ( self.frame). 두 번째 프레임을 제거하고 위젯을 직접 self에 추가하면이 작업을 단순화 할 수 있습니다.

class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.createWidgets() 

    def createWidgets(self): 
     self.button = Button(self, text="QUIT", fg="red", command=self.quit) 
     self.button.pack(side=LEFT) 

     self.hi_there = Button(self, text="Hello", command=self.say_hi) 
     self.hi_there.pack(side=LEFT) 

     self.hi_there.pack({"side": "right"}) 
관련 문제