2016-09-21 20 views
0

LoginPageクラスのフレームと関数buttonLoginClickedを切り替える関数を実行しようとしています。 CCTV メソッドで実行したい機能は、ログインページメソッドでのみ動作していますが、その理由はわかりません。どんな助けも高く評価されます。python tkinterは実行コマンドを発行します

import tkinter as tk 
from tkinter import ttk, messagebox 
from Login import * 

TITLE_FONT = ("Verdana", 12) 
NORMAL_FONT = ("Verdana", 8) 

class CCTV(tk.Tk): 

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

     tk.Tk.iconbitmap(self, default="FittleworthLogo.ico") 
     tk.Tk.wm_title(self, "Fittleworth CCTV") 

     container = tk.Frame(self) 
     container.pack() 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (LoginPage, PageOne): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(column=0, row=0, sticky="nsew") 

     self.show_frame(LoginPage) 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 


class LoginPage(tk.Frame): 

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

     self.labelTitle = ttk.Label(self, text="Login Page", font=TITLE_FONT) 
     self.labelUsername = ttk.Label(self, text="Username", font=NORMAL_FONT) 
     self.entryUsername = ttk.Entry(self, font=NORMAL_FONT) 
     self.labelPassword = ttk.Label(self, text="Password", font=NORMAL_FONT) 
     self.entryPassword = ttk.Entry(self, show = "*", font=NORMAL_FONT) 
     self.buttonLogin = ttk.Button(self, text="Login", command=self.buttonLoginClicked) 
     #self.buttonLogin = ttk.Button(self, text="Login", command=lambda: controller.show_frame(PageOne)) 

     self.labelTitle.grid(row=0, columnspan=2, pady=10) 
     self.labelUsername.grid(row=1, column=0, sticky="w") 
     self.entryUsername.grid(row=1, column=1) 
     self.labelPassword.grid(row=2, column=0, sticky="w") 
     self.entryPassword.grid(row=2, column=1) 
     self.buttonLogin.grid(row=3, columnspan=2, pady=10) 

    def buttonLoginClicked(self): 
     global account 
     username = self.entryUsername.get() 
     password = self.entryPassword.get() 

     validPassword = loggingIn(account, username, password) 

     #This isn't working either 
     self.buttonTest = ttk.Button(text="TEST", command=lambda: controller.show_frame(PageOne)) 
     self.buttonTest.grid(row=4) 

     if validPassword: 
      #Need to switch frames to PageOne here 
      #This doens't work 
      controller.show_frame(PageOne) 

      #This does 
      tk.messagebox.showinfo("Login successful", "You are now logged in") 
     else: 
      tk.messagebox.showinfo("Login error", "Incorrect username or password") 



class PageOne(tk.Frame): 

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

     self.labelTitle = ttk.Label(self, text="Login Page", font=TITLE_FONT) 
     self.loginButton = ttk.Button(self, text="Login", command=lambda: controller.show_frame(LoginPage)) 

     self.labelTitle.grid(row=0, columnspan=2, pady=10) 
     self.loginButton.grid(row=3, columnspan=2, pady=10) 


app = CCTV() 
app.geometry("800x600") 
account = gettingAccountInformation() 
app.mainloop() 
+0

「LoginPage initメソッドでのみ機能する」とは何ですか?コードをどこに移動するとどうなりますか?間違いはありますか?もしそうなら、エラーは何ですか?おそらく、間違っていることが間違いなく正確に伝えられます。エラーが表示されない場合は、結果と期待どおりの違いはありますか? –

+0

いいえ私はエラーを取得しませんでした。私は理由を考え出した。これは、__init__メソッドでは、他の関数で使用するためにself.controller = controllerを実行する必要があるためです。それから私はちょうどself.controller.show_frame(PageOne)を使用し、それは働いた – ConorYoungs

答えて

1

私は、次の..

追加して、それを自分自身を固定:その後、各クラス

のinit方法でself.controller =コントローラ行い、それを呼び出す:self.controller。 show_frame(Page)

これは私にとってはうまくいった!

関連する問題