单击按钮后如何打开另一个 window 并关闭当前 window?

How to open another window and close the current window after clicking button?

我不熟悉使用 Python 的图形用户界面。从登录页面单击“注册”按钮后,我试图打开注册页面。然后,单击“Return登录”时return进入登录页面。但是没有用。

login.py

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from register import Register

class Login:
    def __init__(self):
        self.loginw = Tk()
        self.loginw.title("Login")
        self.loginw.geometry("500x500")
        
        self.signin = Button(self.loginw,width=20, text="Register", command=self.register)
        self.signin.place(relx=0.5, rely=0.5, anchor=CENTER)

    def register(self):
        self.loginw.quit()
        win = Toplevel()
        Register(win)

w=Login()
w.loginw.mainloop()

register.py

from tkinter import *
from tkinter import messagebox
from tkinter import ttk

class Register:
    def __init__(self):
        self.reg = Tk()
        self.reg.title("Register")
        self.reg.geometry("500x500")
        
        self.revert = Button(self.reg,width=20, text="Return to Login")
        self.revert.place(relx=0.5, rely=0.5, anchor=CENTER)

点击注册按钮后出现的错误

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "c:\Users\me\Documents\Education\Testing code\login.py", line 18, in register
    Register(win)
TypeError: Register.__init__() takes 1 positional argument but 2 were given

非常感谢。

当您调用 Register class 的构造函数以获取 window 时,您传递了名为 winToplevel 实例,但在__init__ Register 的方法 class 您不接受构造函数的任何参数。

这可以通过在 __init__ 方法中接受另一个参数来解决。进一步注意,不需要将 self.reg 初始化为 tkinter.Tk() 然后作为参数的 Toplevel 实例将在它的位置工作。

Register class 定义将更改为 -:

class Register:
    def __init__(self, win):
        self.reg = win # new.
        self.reg.title("Register")
        self.reg.geometry("500x500")
        
        self.revert = Button(self.reg,width=20, text="Return to Login")
        self.revert.place(relx=0.5, rely=0.5, anchor=CENTER)
        self.reg.mainloop() # new.

此外,现在必须为新的 window 初始化启动一个新的主循环,因此添加了行 self.reg.mainloop()

根据建议的更改,输出似乎符合 OP 的要求 -: