2016-12-12 76 views
-1

したがって、2つのクラスがあります.ApplicationWindowはmain、LoginWindowはmainのトップレベルです。だから私は入力された値をトップレベルウィンドウからメインのself.LOGINとself.PASSWに戻すことはできません。 SOを介して見られた - 私を助けることが何も見つかりませんでした。手伝って頂けますか?Tkinter、トップレベルウィンドウから値を取得

マイコード:

import os 
import sys 
import tkinter as tk 

class ApplicationWindow(tk.Tk): 
    def __init__(self, master=None): 
     # print(l,p) 
     self.LOGIN = "555" 
     self.PASSW = "666" 
     self.master = master 
     self.master.geometry('800x400') 
     self.master.title("app") 
     self.master.f_app = tk.Frame(self.master).pack() 
     self.menuBuild() 

     self.b_log = tk.Button(self.master, width=10, text="button").pack() 


    def menuBuild(self): 
     menubar = tk.Menu(self.master) 
     self.master.config(menu=menubar) 

     mainMenu = tk.Menu(menubar, tearoff=0) 
     mainMenu.add_command(label="Login", command=self.login) 
     mainMenu.add_separator() 
     mainMenu.add_command(label="Exit", command=self.onExit) 
     menubar.add_cascade(label="File", menu=mainMenu) 


    def login(self): 
     self.tl_log = tk.Toplevel(self.master) 
     self.login = LoginWindow(self.tl_log) 


    def onExit(self): 
     self.master.destroy() 


class LoginWindow(tk.Tk): 
    def __init__(self, master=None): 
     self.master = master 
     self.master.title("login") 
     self.master.f_login = tk.Frame(self.master) 
     self.master.geometry("300x100") 
     self.l_log = tk.Label(self.master, text="mailbox") 
     self.l_psw = tk.Label(self.master, text="password") 
     self.e_log = tk.Entry(self.master, width=25) 
     self.e_psw = tk.Entry(self.master, show="*", width=25) 
     self.b_log = tk.Button(self.master, width=10, text="login", command=self.func) 
     self.l_log.grid(row=1, column=1) 
     self.l_psw.grid(row=2, column=1) 
     self.e_log.grid(row=1, column=2) 
     self.e_psw.grid(row=2, column=2) 
     self.b_log.grid(row=3, column=1, columnspan=2) 


    def func(self): 
     l = self.e_log.get() 
     p = self.e_psw.get() 
     if l == "" or " " in l: 
      print("not") 
     else: 
      return l, p 
      self.master.destroy() 


def main(): 
    root = tk.Tk() 
    main = ApplicationWindow(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 
+2

なしなし!オブジェクトを 'Tk'インスタンスとして使用しない場合、' tk.Tk'から継承しないでください!今は問題がないかもしれませんが、 'super().__ init __(master)'を継承すれば、どのように爆発しているのか分かります。 –

+2

return文の後に 'self.master.destroy()'を置くことは決して実行されないことを意味し、 'return'はその関数を終了します。 –

+1

_one_ classに 'Tk'を継承させても構いませんが、複数のクラスを持つべきではありません。 –

答えて

1

私はそれが、その後LoginWindowに渡されますApplicationWindow内のログインアクションを扱うだろう機能を持つことが理にかなって考えて、このような何か:

class ApplicationWindow: 
    ... 
    def handle_login(self,name,passw): 
     self.LOGIN = name 
     self.PASSW = passw 
     print("login was recieved from ApplicationWindow") 

あなたはLoginWindowに引数として渡すことができます。

class ApplicationWindow: 
    ... 
    def login(self): 
     self.tl_log = tk.Toplevel(self.master) 

     self.login = LoginWindow(self.tl_log, self.handle_login) 

、後で使用するためにインスタンス変数として保存:

class LoginWindow(): 
    def __init__(self, master, login_action): 
     self.successful_login_action = login_action 
     ... 

ので、代わりのreturn l,pあなただけself.successful_login_action(l,p)を呼び出します。

class LoginWindow(): 
    ... 
    def func(self): 
     l = self.e_log.get() 
     p = self.e_psw.get() 
     if l == "" or " " in l: 
      print("not") 
     else: 
      self.successful_login_action(l,p) 
      #return l, p 
      self.master.destroy() #now this is called! Yay :) 
+0

ありがとうございました。私はこの瞬間を授業の今後の作業に留めておきます。 – genesi5

関連する問題