Python 被root与self.root以及_init_u;的使用弄糊涂了。还与定义和类混淆

Python 被root与self.root以及_init_u;的使用弄糊涂了。还与定义和类混淆,python,python-3.x,tkinter,tk,python-3.6,Python,Python 3.x,Tkinter,Tk,Python 3.6,第一: 此代码错误(回溯(最近一次调用): 文件“/Users/me/pythonfolder/frametest.py”,第4行,在 self.root=Tk() 名称错误:名称“self”未定义) 一个窗口打开了,但是是空的 下一步: 这个很好用 为什么使用self.root会导致错误而不仅仅是root 此外: 使用init导致此错误: AttributeError:“非类型”对象没有属性“tk” 使用self.root代替root会导致相同的错误。删除event=None也会导致此错误 基

第一:

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

一个窗口打开了,但是是空的

下一步:

这个很好用

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

此外:

使用init导致此错误: AttributeError:“非类型”对象没有属性“tk” 使用self.root代替root会导致相同的错误。删除event=None也会导致此错误


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

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

一个小演示:

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()
这并不像看上去那么简单,但我想你现在有了一点想法

你期望自己成为什么样的人
self
与任何其他变量一样,必须首先定义。对于最后一个,您不应该覆盖文件的默认
\uuuu init\uuuu
。我建议阅读一篇教程。它以前很有用,比如tkinter import*类应用程序(对象)中的代码“code”:def _uinit___;(self,event=None):self.root=Tk()self.root.configure(bg=“darkorchid1”,padx=10,pady=10)self.root.title(“欢迎使用我的程序)”)self.username=“Bob”“code”很抱歉设置了格式,不知道如何在注释中显示代码-我是新手。如果你能解释一下如何像在主帖子中那样格式化代码,我会这样做的,我将不胜感激。您的评论将始终通知帖子作者。要同时通知之前的评论者,请提及他们的用户名:@peter或@PeterSmith都可以。这就是它在帮助中所说的(如果'as'lol'以前工作得很好的话),比如在tkinter import*
类应用程序(object):def\uu init\uuuuuu(self,event=None):
self.root=Tk()self.root.configure(bg=“darkorchid1”,padx=10,pady=10)
self.root.title(“欢迎使用我的程序”))self.username=“Bob”
仍然不确定如何正确格式化行@abccdI我想我能理解,但是如何通过demo而不是init调用obj1?我想您可能需要类型obj1=\uuuuu init\uuuu10?有一些具有特殊用途的默认函数,如
\uuuuu init\uuuuuuuuo()
将在定义新类对象时调用
\uuu str\uuuuuuuuo()
,还有许多类似的函数。因此,自动调用函数在这里有一些特殊用途。@gmonz
\uuuuu init\uuuuuu
就是所谓的类“构造函数”。。。当您创建一个类的“实例”时,会调用它
obj1=demo(10)
是他创建类demo的“实例”的地方。10是一个参数,它在创建时被传递给“构造函数”
\uuuu init\uuuu
。“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()
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()
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(obj1.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