首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我试图通过对另一个窗口的定义来销毁另一个窗口,但我一直收到这个错误

我试图通过对另一个窗口的定义来销毁另一个窗口,但我一直收到这个错误
EN

Stack Overflow用户
提问于 2018-06-08 04:26:11
回答 1查看 44关注 0票数 2

每当我点击注册时,它就会出现这个错误

代码语言:javascript
复制
AttributeError: 'function' object has no attribute 'destroy'

我不明白为什么它不起作用我什么都试过了。我的程序现在的目标是,当我运行程序时,它将启动一个登录屏幕,如果我单击注册,它将关闭窗口,进入log_to_reg定义,其中显示为login_screen并打开register_screen

代码语言:javascript
复制
    #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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 05:55:06

你的错误的答案是:

销毁函数:“

”对象没有“”AttributeError“”属性“”

您有一个名为login_screen的函数,并且您试图对该函数调用destroy(),因此它会抛出一个错误。

这在一定程度上是因为您将函数和根窗口命名为相同的名称。另一部分是因为根窗口只是函数中的一个局部变量,所以login_screen函数外部的函数看不到内部的tkinter实例。

你可以使用global来管理这样的东西,但这并不是最好的选择。您确实希望避免在tkinter中多次使用Tk(),并避免使用global

相反,我们可以将每个项目设置为一个类,并使用tkinters Toplevel()打开注册窗口。

下面是代码的修改版本,使用grid()来管理窗口中的所有内容。我们还可以使用withdrow()deiconify()来管理哪些窗口是可见的。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档