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
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
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 项目中的表现,请评论此答案。
添加回答
举报