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

时间:2017-03-12 02:26:43

标签: python python-3.x tkinter tk python-3.6

第一

$ sudo apt-get remove nodejs
$ sudo ln -s /usr/bin/node /usr/bin/nodejs
此代码出现

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

窗口打开但是空白。

下一步:

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()

这很好用。

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

此外:

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()

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

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

1 个答案:

答案 0 :(得分: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

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