为了账号安全,请及时绑定邮箱和手机立即绑定

登录成功后如何打开主窗口

登录成功后如何打开主窗口

胡说叔叔 2022-06-28 15:15:44
我开始盯着python。我有一个udemy课程,还阅读了这篇文章:如何在Tkinter成功登录后让你的主窗口出现(PYTHON 3.6尽管如此,我仍然无法实施 recired 事件。我想在登录后打开桌面应用程序的新(主)窗口。由于某种原因,该脚本还突然打开了第三个窗口。自从 2 天以来,我对那些东西的工作感到非常沮丧......感谢帮助 :)from tkinter import Tk, Label, Button, messageboxfrom tkinter import *class AirsoftGunRack:    ##### Main Window #####    ##### Login Page #####def __init__(self,master):    """    :type master: object    """    ##### Login Page #####    self.master = master    master.title("Login - Airsoft GunRack 3.0")    master.geometry("450x230+450+170")    # Creating describtions    self.username = Label(master, text="Username:")    self.username.place(relx=0.285, rely=0.298, height=20, width=55)    self.password = Label(master, text="Password:")    self.password.place(relx=0.285, rely=0.468, height=20, width=55)    # Creating Buttons    self.login_button = Button(master, text="Login")    self.login_button.place(relx=0.440, rely=0.638, height=30, width=60)    self.login_button.configure(command=self.login_user)    self.exit_button = Button(master, text="Exit")  # , command=master.quit)    self.exit_button.place(relx=0.614, rely=0.638, height=30, width=60)    self.exit_button.configure(command=self.exit_login)    # Creating entry boxes    self.username_box = Entry(master)    self.username_box.place(relx=0.440, rely=0.298, height=20, relwidth=0.35)    self.password_box = Entry(master)    self.password_box.place(relx=0.440, rely=0.468, height=20, relwidth=0.35)    self.password_box.configure(show="*")    self.password_box.configure(background="white")
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

您的身份验证的想法很好。


在更高级的级别,您需要开始使用数据库管理您的 tkinter 应用程序(我建议使用 postgresql)并从那里管理您的用户和密码


为了防止 X 按钮的错误,您可以在类初始化中添加以下行:


login.protocol("WM_DELETE_WINDOW",self.event_X)

在Login类中也加入这个函数:(定义event_X函数)


    def event_X(self):

        if messagebox.askokcancel("Exit", "Are you sure you want to exit?"):

            exit()

这将是最终代码:


from tkinter import Tk, Label, Button, messagebox

from tkinter import *



##### Login Page #####


class Login_Page:


    def __init__(self, login=Tk()):  # This is my first change so i already initialize a Tk window inside the class

        """


        :type login: object

        """

        self.login = login

        login.protocol("WM_DELETE_WINDOW",self.event_X)

        login.title("Login - Airsoft GunRack 3.0")

        login.geometry("450x230+450+170")


    # Creating describtioneves


        self.username = Label(login, text="Username:")

        self.username.place(relx=0.285, rely=0.298, height=20, width=55)


        self.password = Label(login, text="Password:")

        self.password.place(relx=0.285, rely=0.468, height=20, width=55)


        # Creating Buttons


        self.login_button = Button(login, text="Login")

        self.login_button.place(relx=0.440, rely=0.638, height=30, width=60)

        self.login_button.configure(command=self.login_user)


        self.login_completed = IntVar()


        self.exit_button = Button(login, text="Exit")  # , command=master.quit)

        self.exit_button.place(relx=0.614, rely=0.638, height=30, width=60)

        self.exit_button.configure(command=self.exit_login)


        # Creating entry boxes


        self.username_box = Entry(login)

        self.username_box.place(relx=0.440, rely=0.298, height=20, relwidth=0.35)


        self.password_box = Entry(login)

        self.password_box.place(relx=0.440, rely=0.468, height=20, relwidth=0.35)

        self.password_box.configure(show="*")

        self.password_box.configure(background="white")


        # Creating checkbox


        self.var = IntVar()

        self.show_password = Checkbutton(login)

        self.show_password.place(relx=0.285, rely=0.650, relheight=0.100, relwidth=0.125)

        self.show_password.configure(justify='left')

        self.show_password.configure(text='''Show''')

        self.show_password.configure(variable=self.var, command=self.cb)


    def event_X(self):

        if messagebox.askokcancel("Exit", "Are you sure you want to exit?"):

            exit()


    def cb(self, ):

        if self.var.get() == True:

            self.password_box.configure(show="")

        else:

            self.password_box.configure(show="*")



# Giving function to login process


    def login_user(self):

        name = self.username_box.get()

        password = self.password_box.get()

        login_completed = self.login_completed.get()


        if name == "user" and password == "1234":

            # messagebox.showinfo("Login page", "Login successful!")

            self.login.destroy()  # Removes the toplevel window

            # self.main_win.deiconify() #Unhides the root window

            self.login_completed == 1


        else:

            messagebox.showwarning("Login Failed - Acess Denied", "Username or Password incorrect!")


        # return



    def exit_login(self):

        msg = messagebox.askyesno("Exit login page", "Do you really want to exit?")

        if (msg):

            exit()



    def mainloop_window(self):  # This is the class function that helps me to mainloop the window

        self.login.mainloop()



login_page = Login_Page()  # I dont need to pass the root now since its initialized inside the class

login_page.mainloop_window()  # Just mainlooping the authentication window



    ##### Main Window #####



class Main_Win:

    def __init__(self, main_win=Tk()):  # This is my first change so i already initialize a Tk window inside the class

        self.main_win = main_win

        main_win.title("Airsoft GunRack 3.0")

        main_win.geometry("900x500+250+130")



    def mainloop_window(self):  # This is the class function that helps me to mainloop the window

        self.main_win.mainloop()



main_win = Main_Win()  # I dont need to pass the root now since its initialized inside the class

main_win.mainloop_window()  # Just mainlooping the authentication window



查看完整回答
反对 回复 2022-06-28
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

是的,@Jim Erginbash!这就是我希望它工作的方式。所以,我为主要胜利创建了一个单独的班级。我想到了认证程序。如果登录成功,我的想法是创建一个值为“true”的新变量(login_completed)。在第二步中,main_win 类将在取消隐藏主窗口(撤回命令)之前检查该值是否为“真”。可悲的是,我无法让它正常工作。不知道在哪里添加代码以及如何添加。


这是迄今为止的新代码。为了更好地理解,我还重命名了一些参数,它们也属于窗口。


我还注意到,通过使用框架按钮 (X) 关闭登录页面,它还将继续执行创建主窗口的代码。你知道怎么杀死它吗?


从 tkinter 导入 Tk、标签、按钮、消息框 从 tkinter 导入 *


    ##### Login Page #####


class Login_Page:


def __init__(self,login = Tk()): #This is my first change so i already initialize a Tk window inside the class

    """


    :type login: object

    """



    self.login = login

    login.title("Login - Airsoft GunRack 3.0")

    login.geometry("450x230+450+170")



    # Creating describtions


    self.username = Label(login, text="Username:")

    self.username.place(relx=0.285, rely=0.298, height=20, width=55)


    self.password = Label(login, text="Password:")

    self.password.place(relx=0.285, rely=0.468, height=20, width=55)


    # Creating Buttons


    self.login_button = Button(login, text="Login")

    self.login_button.place(relx=0.440, rely=0.638, height=30, width=60)

    self.login_button.configure(command=self.login_user)


    self.login_completed = IntVar()


    self.exit_button = Button(login, text="Exit")  # , command=master.quit)

    self.exit_button.place(relx=0.614, rely=0.638, height=30, width=60)

    self.exit_button.configure(command=self.exit_login)


    # Creating entry boxes


    self.username_box = Entry(login)

    self.username_box.place(relx=0.440, rely=0.298, height=20, relwidth=0.35)


    self.password_box = Entry(login)

    self.password_box.place(relx=0.440, rely=0.468, height=20, relwidth=0.35)

    self.password_box.configure(show="*")

    self.password_box.configure(background="white")


    # Creating checkbox


    self.var = IntVar()

    self.show_password = Checkbutton(login)

    self.show_password.place(relx=0.285, rely=0.650, relheight=0.100, relwidth=0.125)

    self.show_password.configure(justify='left')

    self.show_password.configure(text='''Show''')

    self.show_password.configure(variable=self.var, command=self.cb)


def cb(self, ):


    if self.var.get() == True:

        self.password_box.configure(show="")

    else:

        self.password_box.configure(show="*")


# Giving function to login process


def login_user(self):

    name = self.username_box.get()

    password = self.password_box.get()

    login_completed = self.login_completed.get()


    if name == "user" and password == "1234":

        #messagebox.showinfo("Login page", "Login successful!")

        self.login.destroy()  #Removes the toplevel window

        #self.main_win.deiconify() #Unhides the root window

        self.login_completed == 1


    else:


        messagebox.showwarning("Login Failed - Acess Denied", "Username or Password incorrect!")


        #return


def exit_login(self):

    msg = messagebox.askyesno("Exit login page", "Do you really want to exit?")

    if (msg):

        exit()


def mainloop_window(self): #This is the class function that helps me to mainloop the window

    self.login.mainloop()



login_page = Login_Page() # I dont need to pass the root now since its initialized inside the class

login_page.mainloop_window() # Just mainlooping the authentication window




   ##### Main Window #####





class Main_Win:


def __init__(self,main_win = Tk()): #This is my first change so i already initialize a Tk window inside the class

    """


    :type main_win: object

    """


    #main_win.withdraw()

    #self.main_win.deiconify() #Unhides the root window

    self.main_win = main_win

    main_win.title("Airsoft GunRack 3.0")

    main_win.geometry("900x500+250+130")








def mainloop_window(self): #This is the class function that helps me to mainloop the window

    self.main_win.mainloop()




main_win = Main_Win() # I dont need to pass the root now since its initialized inside the class


main_win.mainloop_window() # Just mainlooping the authentication window



查看完整回答
反对 回复 2022-06-28
?
隔江千里

TA贡献1906条经验 获得超10个赞

当您创建root = Tk()的新实例时,您将自动打开一个小的默认窗口。


1st) 你有 root = Tk()


2nd)你有初始化的主人


3rd) 你有main_win


因此你有三个窗口


您必须避免在课堂外再次调用 Tk() 类,这就是烦人的第三个窗口问题。


我建议做的是添加一个定义,它只会主循环你的AirsoftGunRack窗口。


这是最终代码:


from tkinter import Tk, Label, Button, messagebox

from tkinter import *


class AirsoftGunRack:


    def __init__(self,master = Tk()): #This is my first change so i already initialize a Tk window inside the class

        """


        :type master: object

        """


        ##### Login Page #####


        self.master = master

        master.title("Login - Airsoft GunRack 3.0")

        master.geometry("450x230+450+170")



        # Creating describtions


        self.username = Label(master, text="Username:")

        self.username.place(relx=0.285, rely=0.298, height=20, width=55)


        self.password = Label(master, text="Password:")

        self.password.place(relx=0.285, rely=0.468, height=20, width=55)


        # Creating Buttons


        self.login_button = Button(master, text="Login")

        self.login_button.place(relx=0.440, rely=0.638, height=30, width=60)

        self.login_button.configure(command=self.login_user)


        self.exit_button = Button(master, text="Exit")  # , command=master.quit)

        self.exit_button.place(relx=0.614, rely=0.638, height=30, width=60)

        self.exit_button.configure(command=self.exit_login)


        # Creating entry boxes


        self.username_box = Entry(master)

        self.username_box.place(relx=0.440, rely=0.298, height=20, relwidth=0.35)


        self.password_box = Entry(master)

        self.password_box.place(relx=0.440, rely=0.468, height=20, relwidth=0.35)

        self.password_box.configure(show="*")

        self.password_box.configure(background="white")


        # Creating checkbox


        self.var = IntVar()

        self.show_password = Checkbutton(master)

        self.show_password.place(relx=0.285, rely=0.650, relheight=0.100, relwidth=0.125)

        self.show_password.configure(justify='left')

        self.show_password.configure(text='''Show''')

        self.show_password.configure(variable=self.var, command=self.cb)


    def cb(self, ):


        if self.var.get() == True:

            self.password_box.configure(show="")

        else:

            self.password_box.configure(show="*")


    # Giving function to login process


    def login_user(self):

        name = self.username_box.get()

        password = self.password_box.get()


        if name == "user" and password == "1234":

            self.main_win.deiconify() #Unhides the root window

            self.master.destroy()  #Removes the toplevel window

            #messagebox.showinfo("Login page", "Login successful!")


        else:

            messagebox.showwarning("Login failed", "Username or password incorrect!")


    def exit_login(self):

        msg = messagebox.askyesno("Exit login page", "Do you really want to exit?")

        if (msg):

            exit()


    def mainloop_window(self): #This is the class function that helps me to mainloop the window

        self.master.mainloop()





main_win = Toplevel()

main_win.title("Main Window")

main_win.title("Main Window")

main_win.geometry("800x800+450+170")


gunrack = AirsoftGunRack() # I dont need to pass the root now since its initialized inside the class

gunrack.mainloop_window() # Just mainlooping the authentication window

#main_win.withdraw()

main_win.mainloop()

请注意,我在此代码中添加了四个注释。在第 6、82、93、94 行


此更改将打开您处理的窗口。


这些当然是我对您的代码块的唯一更改。


如果它影响您在 tkinter 项目中的表现,请评论此答案。


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信