首页 文章

由root vs self.root混淆并使用__init__ . 还与定义和类混淆

提问于
浏览
1

第一:

from tkinter import *


self.root = Tk()
self.root.configure(bg="red", padx=10, pady=10)
self.root.title("WELCOME- PLEASE LOGIN)")

name = Label(self.root, text="Name:", bg="magenta")
password = Label(self.root, text="Password", bg="magenta")
nameentry = Entry(self.root)
passwordentry = Entry(self.root)

name.grid(row=0, sticky=E)
password.grid(row=1, sticky=E)
nameentry.grid(row=0, column=1)
passwordentry.grid(row=1, column=1)

mainloop()

此代码出错(Traceback(最近调用最后一次):文件“/Users/me/pythonfolder/frametest.py”,第4行,在self.root = Tk()NameError:名称'self'未定义)

窗口打开但是空白 .

下一个:

from tkinter import *


root = Tk()
root.configure(bg="red", padx=10, pady=10)
root.title("WELCOME- PLEASE LOGIN)")

name = Label(root, text="Name:", bg="magenta")
password = Label(root, text="Password", bg="magenta")
nameentry = Entry(root)
passwordentry = Entry(root)

name.grid(row=0, sticky=E)
password.grid(row=1, sticky=E)
nameentry.grid(row=0, column=1)
passwordentry.grid(row=1, column=1)

mainloop()

这很好用 .

为什么使用self.root导致错误而不仅仅是root?

也:

from tkinter import *


def __init__(self, Event= None):

    root = Tk()
    root.configure(bg="red", padx=10, pady=10)
    root.title("WELCOME- PLEASE LOGIN)")

    name = Label(root, text="Name:", bg="magenta")
    password = Label(root, text="Password", bg="magenta")
    nameentry = Entry(root)
    passwordentry = Entry(root)

    name.grid(row=0, sticky=E)
    password.grid(row=1, sticky=E)
    nameentry.grid(row=0, column=1)
    passwordentry.grid(row=1, column=1)

mainloop()

使用 init 导致此错误:AttributeError:'NoneType' object没有属性'tk'使用self.root代替root会导致相同的错误 . 删除事件=无也会导致此错误 .

基本上,我对self.root vs root,定义及其错误和类感到困惑 .

1 回答

  • 3

    self 是类级别标识符 . 当你输入 self.root = Tk() 时,它意味着在这个类中它将创建一个类级变量 root 并用 Tk() 对象初始化它,每当你想在类中访问这个变量时你都会用 self.root 来调用它 self.root.title()

    一个小小的演示:

    class demo(object):
        def __init__(self, a):
            self.a = a
    
        def change_a(self, new_a):
            self.a = new_a
    
     obj1 = demo(10) # will call the init fn of class and create a class level variable a = 10
     print(obj.a) # will print 10 which is stored in class level variable for obj1
    
    obj1.change_a(20) # will call the fn and change the class level variable a = 20
    print(obj1.a) # will print 20 becuase class level variable a was changed
    

    它并不像看起来那么简单,但我想你现在有了一点想法

相关问题