Ответ на вашу ошибку:
AttributeError: у объекта 'function' нет атрибута 'destroy'
У вас есть функция с именем login_screen
, и выпопытка вызвать destroy()
для этой функции, чтобы она выдавала ошибку.
Это отчасти потому, что вы назвали свою функцию и корневое окно одним и тем же.Другая часть заключается в том, что корневое окно является только локальной переменной внутри функции, поэтому функции вне функции login_screen
не могут видеть экземпляр tkinter внутри.
Вы можете использовать global для управления такими вещами, как все, но все ивсе это не лучший вариант.Вы действительно хотите избегать использования Tk()
более одного раза в tkinter и избегать использования global
.
Вместо этого мы можем настроить каждый элемент как класс и использовать tkinters Toplevel()
, чтобы открыть окно регистра..
Вот модифицированная версия вашего кода, использующая grid()
для управления всем в окне.Мы также можем использовать withdrow()
и deiconify()
для управления видимыми окнами.
import tkinter as tk
class Login(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.geometry("400x250")
self.title("Tree Road School server")
self.resizable(False,False)
self.configure(background = "Light blue")
self.columnconfigure(0, weight=1)
self.columnconfigure(2, weight=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(2, weight=1)
center_frame = tk.Frame(self)
center_frame.grid(row=1, column=1, sticky="nsew")
tk.Label(center_frame, text="LOGIN", width = '6', font=('Arial', 25)).grid(row=0, column=0, columnspan=2, padx=10, pady=5)
tk.Label(center_frame, text="username: ", font=(15)).grid(row=1, column=0, padx=10, pady=5)
tk.Label(center_frame, text="password: ", font=(15)).grid(row=2, column=0, padx=10, pady=5)
self.username = tk.Entry(center_frame, width=15, bg="White")
self.username.grid(row=1, column=1, padx=10, pady=5)
self.password = tk.Entry(center_frame, width=15, bg="White", show="*")
self.password.grid(row=2, column=1, padx=10, pady=5)
tk.Button(center_frame, text="login", width=10).grid(row=3, column=0, padx=10, pady=5)
tk.Button(center_frame, text="Register", width=14, command=self.atempt_register).grid(row=3, column=1, padx=10, pady=5)
self.mainloop()
def atempt_register(self):
self.withdraw()
RegisterScreen(self, self.username.get(), self.password.get())
class RegisterScreen(tk.Toplevel):
def __init__(self, controller, username, password):
tk.Toplevel.__init__(self)
self.controller = controller
self.protocol("WM_DELETE_WINDOW", self.on_close)
self.geometry("400x250")
self.title("Register")
self.resizable(False, False)
self.configure(background = "Light blue")
self.username = username
self.password = password
tk.Label(self, text=username).grid(row=0, column=0)
tk.Label(self, text=password).grid(row=1, column=0)
def on_close(self):
self.controller.deiconify()
self.destroy()
Login()