0

我做了2个窗口:main& login。我想要顶层的按钮和登录窗口,但总是跳到主窗口,为什么?如果我在 poplogin() 中编写代码而不是导入模块,它可以正常工作。

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()
4

2 回答 2

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()
于 2016-11-21T07:43:38.200 回答
-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()
于 2016-11-21T14:05:37.037 回答