2016-11-21 1 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' в widgets: 'Entry (parent, ...)' и т. д. Если вы не используете родительское, то 'tkinter' используйте главное окно. – furas

+0

@furas это нормально, спасибо U !!! –

+0

@furas Я добавляю правильный код, но я не знаю, почему self.grid() не имеет никакого эффекта? –

ответ

2

Вы должны сообщить виджет, который является его родителем - Widget(parent, ...). Если вы этого не сделаете, используйте главное окно tkinter.

В своем коде вы должны использовать self

И вы должны использовать self.pack(), чтобы показать Frame в Toplevel

#! 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()' в одном окне или фрейме. Всегда показывать полное сообщение об ошибке. Может быть, проблема в другом месте или вам нужно изменить другой пакет() на сетку(). – 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

Я видел комментарий в коде, и я думал, что он не работает. Я вижу, что вместо 'self' вы используете' parent', поэтому вы помещаете непосредственно в Toplevel, чтобы у вас была проблема с 'pack()'. Я использую 'self', поэтому я помещаю в' Frame', а не непосредственно в Toplevel, поэтому я мог бы использовать 'pack()'. Вы можете описать разницу. – furas

Смежные вопросы