【问题标题】:How to return previous window when X windows button is pressed in python 3在python 3中按下X windows按钮时如何返回上一个窗口
【发布时间】: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


【解决方案1】:

你可以先定义on_close()试试

from tkinter import*

w = 300
h = 2


def on_close():
    screen2.withdraw()
    screen.update()
    screen.deiconify()


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("NO IDEA")
    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")

screen2.protocol("WM_DELETE_WINDOW", on_close)

这可能有助于不给出错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多