2016-11-21 59 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

相关问题