对 root vs self.root 和 __init__ 的使用感到困惑。也混淆了定义和 类
Confused by root vs self.root and the use of __init__. Also confused with definitions and classes
第一个:
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()
此代码错误(回溯(最后一次调用):
文件“/Users/me/pythonfolder/frametest.py”,第 4 行,位于
self.root = Tk()
NameError: 名称 'self' 未定义)
A window 打开但空白。
下一个:
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' 对象没有属性 'tk'
使用 self.root 代替 root 会导致相同的错误。删除 event= None 也会导致此错误。
基本上,我对 self.root 与 root、定义及其错误以及 类.
感到困惑
self
是 class 级别标识符。当你键入 self.root = Tk()
时,这意味着在这个 class 中它将创建一个 class 级别变量 root
并使用 Tk()
对象初始化它,并且每当你想访问它时class 中的变量,您将使用 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(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
它并不像看起来那么简单,但我想你现在有点想法了
第一个:
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()
此代码错误(回溯(最后一次调用): 文件“/Users/me/pythonfolder/frametest.py”,第 4 行,位于 self.root = Tk() NameError: 名称 'self' 未定义)
A window 打开但空白。
下一个:
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' 对象没有属性 'tk' 使用 self.root 代替 root 会导致相同的错误。删除 event= None 也会导致此错误。
基本上,我对 self.root 与 root、定义及其错误以及 类.
感到困惑self
是 class 级别标识符。当你键入 self.root = Tk()
时,这意味着在这个 class 中它将创建一个 class 级别变量 root
并使用 Tk()
对象初始化它,并且每当你想访问它时class 中的变量,您将使用 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(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
它并不像看起来那么简单,但我想你现在有点想法了