я пытаюсь уничтожить окно с помощью функции def для другого, но получаю эту ошибку - PullRequest
0 голосов
/ 07 июня 2018

когда я нажимаю зарегистрироваться, появляется ошибка

AttributeError: 'function' object has no attribute 'destroy'

Я не понимаю, почему это не работает, я перепробовал все.цель моей программы на данный момент заключается в том, что когда я запускаю программу, она запускается с экрана входа в систему, и если я нажимаю кнопку регистрации, она закрывает окно, переходя к определению log_to_reg, где говорится, что login_screen, и открывает register_screen

    #importing moduels
from tkinter import *
from tkinter import messagebox
from tkinter import ttk

def login_screen():
    #adding the login screen
    login_screen = Tk()
    login_screen.geometry("400x250")
    login_screen.title("Tree Road School server")
    login_screen.resizable(False,False)
    login_screen.configure(background = "Light blue")
#adding the title label
label_title = Label(login_screen, text="LOGIN", width = '6',
                    font=('Arial', 25)).place(x=135, y= 25)

#adding the labels for loging in
label_username = Label(login_screen, text = "username: ", font=(15))\
                 .place(x=100, y= 100)
label_username1 = Label(login_screen, text = "       ", font=(15), width='13')\
                 .place(x=175, y= 100)

label_space = Label(login_screen, text = "          ", font=(15), width='13')\
                 .place(x=100, y= 120)
label_space1 = Label(login_screen, text = "       ", font=(15), width='13')\
                 .place(x=175, y= 120)

label_password = Label(login_screen, text = "password:  ", font=(15))\
                 .place(x=100, y= 130)
label_password1 = Label(login_screen, text = "       ", font=(15), width='13')\
                 .place(x=175, y= 130)

#adding the entry
username = Entry(login_screen, width = 15, bg = "White")
username.place(x=200, y=102)

#space to make it look nicer
password = Entry(login_screen, width = 15, bg = "White", show = "*")
password.place(x=200, y=132)

#adding the buttons
login_button = Button(login_screen, text = "login",
                      width = 10).place(x=100, y=175)

sign_up_button = Button(login_screen, text = "Register", 
                      width = 14, command = log_to_reg).place(x=190, y=175)

#run mainloop
login_screen.mainloop()

def register_screen():
    register_screen = Tk()
    register_screen.geometry("400x250")
    register_screen.title("Register")
    register_screen.resizable(False,False)
    register_screen.configure(background = "Light blue")

def log_to_reg():
    login_screen.destroy()
    rigister_screen()



login_screen()

1 Ответ

0 голосов
/ 08 июня 2018

Ответ на вашу ошибку:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...