我找到了一个简单的tkinter类的例子。 该示例适用于
'frame'或'self.frame'
为什么我能安全地省略'自我'?
from Tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.button = Button(
frame, text="QUIT", fg="red", command=frame.quit
)
self.button.pack(side=LEFT)
self.hi_there = Button(frame, text="Hello", command=self.say_hi)
self.hi_there.pack(side=LEFT)
def say_hi(self):
print "hi there, everyone!"
root = Tk()
app = App(root)
root.mainloop()
root.destroy() # optional; see description below
答案 0 :(得分:2)
通常,使用像frame
这样的局部变量而不是像self.frame
这样的对象属性更有效。只有在需要能够在创建对象的方法返回后引用该对象时,才应使用对象属性。
在Python中,一旦函数或方法返回,存储在局部变量中的对象就会被垃圾收集,但这不是问题。 Frame对象本身将是持久的,因为它链接到您传递给__init__()
的主对象。
答案 1 :(得分:1)
对于大多数情况,您可以省略self
,self.say_hi
除外。否则,say_hi
引用全局函数,而不是方法。
def __init__(self, master):
frame = Frame(master)
frame.pack()
button = Button(frame, text="QUIT", fg="red", command=frame.quit)
button.pack(side=LEFT)
hi_there = Button(frame, text="Hello", command=self.say_hi)
hi_there.pack(side=LEFT)
只要框架对象仅在方法中引用,就可以使用 self.frame
/ frame
。如果在另一种方法中使用它,则应将其限定为self.frame
。
答案 2 :(得分:0)
您可以在self
之前省略frame
,因为您将对Button
的引用传递到self.button
,该Button
存储为frame
(大概__init__
拥有引用到你的框架。)
这可确保您frame
不会被垃圾收集,因为只有self.button
范围之外的对象才会被销毁。
在此示例中,self.frame
之外的self
没有用,所以在{{1}}中无法存储其他引用。
如其他答案中所述,如果您希望稍后直接引用与对象实例相关的内容,则只需要{{1}}。