2017-12-19 26 views
-1

tkinter 및 객체 지향 프로그래밍을 처음 사용합니다.Tkinter가 부모 클래스에서 함수를 상속받을 수 없습니다.

Exception in Tkinter callback Traceback (most recent call last): 
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) File "H:\Networ\multiwindowguiskeleton.py", line 44, in checkpassword 
    controller.show_frame(messagescreenpagevar) 
NameError: name 'controller' is not defined 

코드는 다음과 같습니다 :

라인 (44)에
import tkinter as tk 

class Guiroot(tk.Tk): 
    def __init__(self,*args,**kwargs): 

     tk.Tk.__init__(self,*args,**kwargs) 
     framecontainer = tk.Frame(self) 

     framecontainer.pack(side="top",fill="both",expand=True) 

     framecontainer.grid_rowconfigure(0,weight=1) 
     framecontainer.grid_columnconfigure(0,weight=1) 
     self.title("Vault Messenger") 

     self.frames = {} 

     passwordpagevar = passwordpage(framecontainer,self) # this is adding the different pages to a list so they can be called forward later. 
     messagescreenpagevar = messagescreen(framecontainer,self) 

     self.frames[passwordpagevar] = passwordpagevar 
     self.frames[messagescreenpagevar] = messagescreenpagevar 

     passwordpagevar.grid(row=0 , column = 0, sticky = "nsew") 
     messagescreenpagevar.grid(row=0 , column = 0, sticky = "nsew")   

     self.show_frame(passwordpagevar) 

    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 

class passwordpage(tk.Frame): 
    def checkpassword(self): 
     if self.usernamebox.get() == "admin" and self.passwordbox.get() == "password": 
      self.errorlabel['text'] = "Correct entry/pass" 
      controller.show_frame(messagescreenpagevar) 
     else: 
      self.errorlabel['text'] = "Incorrect entry/pass" 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 

     self.usernamelabel = tk.Label(self,text="Username:") 
     self.usernamebox = tk.Entry(self) 
     self.passwordlabel = tk.Label(self, text="Password:") 
     self.passwordbox = tk.Entry(self,show="*") 
     self.errorlabel = tk.Label(self, text = "") 
     self.enterdetails = tk.Button(self, text = "Enter", command = self.checkpassword) 


     self.usernamelabel.grid(row=0) 
     self.usernamebox.grid(row=1) 
     self.passwordlabel.grid(row=2) 
     self.passwordbox.grid(row=3) 
     self.errorlabel.grid(row=4) 
     self.enterdetails.grid(row=5) 

class messagescreen(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 

     self.userlist = tk.Listbox(self, width = 20, height = 20) 
     self.chatbox = tk.Text(self, width = 50,height = 20) 
     self.chatentry = tk.Entry(self, width = 60) 
     self.sendmessagebutton = tk.Button(self, text = "Send") 


     self.userlist.grid(row=0,column=0) 
     self.chatbox.grid(row=0,column=1, columnspan = 2) 
     self.chatentry.grid(row=1,column=1) 
     self.sendmessagebutton.grid(row=1,column= 2) 

root = Guiroot() 
root.mainloop() 
+1

'컨트롤러'가 정의되어 있지 않습니다. 그게 뭐야? 당신은 아마도'__init__'에서'self.controller = controller'를 잊었을 것입니다. –

+0

__init 함수에서 self.controller = controller를 수행하고 self.controller.show_frame (messagescreenpagevar)을 수행하면 – user2191568

+0

오류가 발생합니다 NameError : name 'messagescreenpagevar'is is 정의되지 않았습니다. – user2191568

답변

1

, 통역 다음 코드를 실행 대신 프레임을 전환하는, 관리자/암호에 넣어 몇 가지 이유를 들어, 다음과 같은 오류를 제공합니다 다음 식을 구한다.

controller.show_frame(messagescreenpagevar) 

이 범위에서, controller은 정의되지 않았다. 그렇기 때문에 통역사가 오류 name 'controller' is not defined을 묻는 것입니다.

파이썬은 어휘 범위를 사용합니다. 라인 (44)에 정의 된 변수 controller을 위해 그래서, 당신은 그것을 정의하는 것 중 하나

  • 모듈의 전역 범위의 방법 checkpassword
  • 클래스 passwordpage