2016-11-21 51 views
0

我做了2個窗口:main & login。我想按鈕和登錄窗口在頂層,但總是跳到主,爲什麼? 如果我在poplogin()中編寫代碼而不是導入模塊,則它工作正確。tkinter:爲什麼我的登錄窗口不在正確的位置?

main.py 
#! python3 
from tkinter import * 
from login import login 

def demo(): 
    root = Tk() 
    root.title("demo") 
    root.geometry('640x400') 
    Button(root,text='login',width=10,command=poplogin).grid(row=3,column=1,padx=10,pady=5) 
    root.mainloop() 

def poplogin(): 
    toplevel = Toplevel() 
    toplevel.grid() 
    toplevel.title('login') 
    login(toplevel) 

if __name__ == "__main__":demo() 

login.py 
#! python3 
from tkinter import * 

class login(Frame): 

    def __init__(self,parent=None): 
     Frame.__init__(self,parent) 
     self.creat_login() 

    def creat_login(self): 
     Label(text='email').grid(row=1) 
     user_email = Entry() 
     user_email.grid(row=1,column=1,padx=10,pady=5) 

     Label(text='password').grid(row=2) 
     user_password = Entry(show='*') 
     user_password.grid(row=2,column=1,padx=10,pady=5) 

     Button(text='login',width=10).grid(row=3,column=1,padx=10,pady=5) 


if __name__ == '__main__': 
    login().mainloop() 
+1

你必須使用'parent'在窗口小部件:'Entry(parent,...)'等。如果你不使用父窗口,那麼'tkinter'使用主窗口。 – furas

+0

@furas它是好的謝謝你! –

+0

@furas我最後添加了正確的代碼,但我不知道爲什麼self.grid()看起來沒有任何影響? –

回答

2

您必須通知插件誰是它的父 - Widget(parent, ...)。如果你不這樣做,那麼tkinter使用主窗口。

在你的代碼必須使用self

而且你必須使用self.pack()顯示FrameToplevel

#! python3 

from tkinter import * 

class login(Frame): 

    def __init__(self, parent=None): 
     Frame.__init__(self, parent) 
     self.creat_login() 

     # show in Toplevel 
     self.pack() 

    def creat_login(self): 
     # self 
     Label(self, text='email').grid(row=1) 

     # self 
     user_email = Entry(self) 
     user_email.grid(row=1, column=1, padx=10, pady=5) 

     # self  
     Label(self, text='password').grid(row=2) 

     # self 
     user_password = Entry(self, show='*') 
     user_password.grid(row=2, column=1, padx=10, pady=5) 

     # self 
     Button(self, text='login', width=10).grid(row=3, column=1, padx=10, pady=5) 

if __name__ == '__main__': 
    login().mainloop() 
+0

謝謝你的回覆,我嘗試你的代碼,崛起_tkinter.TclError:不能在裏面使用幾何管理器包。其中已經有由網格管理的奴隸,所以我將self.pack()更改爲self.grid(),但結果始終在主窗口中。 –

+0

你不能在一個窗口或框架中同時使用'pack()','grid()'或'place()'。始終顯示完整的錯誤消息。也許問題出在不同的地方,或者你必須將其他pack()更改爲grid()。 – furas

-1

權代碼

from tkinter import * 

class login(Frame): 

    def __init__(self, parent=None): 
     Frame.__init__(self, parent) 
     self.creat_login(parent) 

     # With or without this line the same results,I don't know why 
     self.grid() 

    def creat_login(self,parent): 

     Label(parent, text='email').grid(row=1) 

     user_email = Entry(parent) 
     user_email.grid(row=1, column=1, padx=10, pady=5) 

     Label(parent, text='password').grid(row=2) 

     user_password = Entry(parent, show='*') 
     user_password.grid(row=2, column=1, padx=10, pady=5) 

     Button(parent, text='login', width=10).grid(row=3, column=1, padx=10, pady=5) 

if __name__ == '__main__': 
    login().mainloop() 
+0

它是回答的地方,而不是問題。將此添加到您的問題。並添加完整的錯誤信息(Traceback)。 – furas

+0

此代碼可以工作,所以我發佈它。沒有任何錯誤信息。 –

+0

我在代碼中看到了評論,我認爲它不起作用。我看到你使用'parent'而不是'self',所以你直接把它放在Toplevel中,所以你可能會遇到'pack()'的問題。我使用'self',所以我放入了'Frame',而不是直接放在Toplevel中,所以我可以使用'pack()'。你可以描述不同之處。 – furas

相關問題