单击按钮后如何打开另一个 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 时,您传递了名为 win
的 Toplevel
实例,但在__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 的要求 -:
我不熟悉使用 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 时,您传递了名为 win
的 Toplevel
实例,但在__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 的要求 -: