【发布时间】:2019-07-19 14:58:09
【问题描述】:
我对 python 很陌生,目前正在学习如何创建登录系统。这样做时,我遇到了一个问题,当按下当前窗口的 x 按钮时,我需要打开前一个窗口。
我试过编辑这个,但是当我把它写成“on_close():”在其他函数上调用它时,它给了我和错误:"NameError: name 'on_close' is not defined"
def on_close():
#custom close options, here's one example:
close = messagebox.askokcancel("Close", "Would you like to close the program?")
if close:
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_close)
from tkinter import*
from tkinter import messagebox
w = 300
h = 2
def register_user():
global username_info
global password_info
username_info = username.get()
password_info = password.get()
file = open(username_info+".txt", "w")
file.write(username_info)
file.write(password_info)
file.close()
username_entry.delete(0, END)
password_entry.delete(0, END)
Label(text = "Registration Success")
def register():
global screen1
screen.withdraw()
screen1 = Toplevel(screen)
screen1.title("Registration")
screen1.geometry("300x250")
global username
global password
global username_entry
global password_entry
username = StringVar()
password = StringVar()
Label(screen1, text = " Please Enter Your Details Below*").pack()
Label(screen1, text = "").pack()
Label(screen1, text = "Username *").pack()
username_entry = Entry(screen1, textvariable = username)
username_entry.pack()
Label(screen1, text = "Password *").pack()
password_entry = Entry(screen1, textvariable = password)
password_entry.pack()
Label(screen1, text = "").pack()
Button(screen1, text= "Register", height="1", width="10", command = register_user).pack()
def login():
global screen2
screen.withdraw()
screen2 = Toplevel(screen)
screen2.title("HOT or SUPER HOT")
screen2.geometry("500x400")
on_close():
def main_Screen():
global screen
screen = Tk()
screen.geometry("600x300")
screen.title("Login System")
Label(text = "Login System" , bg = "black", width = w , height = h, font = ("Calibri", 20) , fg = "white").pack()
Label(text = "").pack()
Button(text = "Login", height = h, width = "30", command = login).place(x=50 , y=200)
Label(text = "").pack()
Button(text = "Register" ,height = h, width = "30", command = register).place(x=320 , y=200)
screen.mainloop()
main_Screen()
print("Hello World")
def on_close():
screen2.withdraw()
screen.update()
screen.deiconify
screen2.protocol("WM_DELETE_WINDOW", on_close)
已解决,感谢帮助
当我将'screen2.protocol("WM_DELETE_WINDOW", on_close) 添加到def login() 中时解决了这个问题:
【问题讨论】:
-
在运行
main_Screen()之前放置def on_close()运行mainloop()会阻塞程序 - 所以main_Screen()之后的代码不会执行,Python 不知道函数on_close() -
我按照你说的做了,但是又出现了一个错误,它说'screen2 is not defined'
-
你应该把
screen2.protocol()放在创建screen2的函数中 -
在
screen.deiconify()之后尝试screen.lift() -
我的错误是错误,
line 70, in <module> screen2.protocol("WM_DELETE_WINDOW", on_close) NameError: name 'screen2' is not defined
标签: python python-3.x tkinter window