2016-12-12 62 views
-1

所以,我有兩個類,ApplicationWindow是main和LoginWindow是main的頂層。所以我不能將從頂級窗口輸入的值返回到main的self.LOGIN和self.PASSW。通過所看到的 - 沒有發現任何可以幫助我的東西。你可以幫我嗎?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

在返回語句之後放置'self.master.destroy()'意味着它永遠不會執行,'return'結束函數。 –

+1

(可以說)確定_one_類從'Tk'繼承,但你肯定不應該有多個。 –

回答

1

我認爲這將是有意義的有將處理中ApplicationWindow登陸行動,那麼這將被傳遞到LoginWindow的功能,這樣的事情:

class ApplicationWindow: 
    ... 
    def handle_login(self,name,passw): 
     self.LOGIN = name 
     self.PASSW = passw 
     print("login was recieved from ApplicationWindow") 
您可以將它作爲參數傳遞給:

,並存儲爲以後使用的實例變量:

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