在OO GUI编程方面(主要是使用JAVA和Tkinter),我已经注意到,在某些代码中,所有窗口小部件都分配给实例属性,而在其他代码中,很少有(如果有的话)。
例如,在python docs的Tkinter章节的A Simple Hello World Program中,两个按钮都分配给Application类的实例属性:
class Application(Frame):
...
def createWidgets(self):
self.QUIT = Button(self)
...
self.hi_there = Button(self)
...
def __init__(self, master=None):
Frame.__init__(self, master)
...
self.createWidgets()
另一方面,Tkinter书的Dialog Windows章定义了一个对话框支持类,其中没有任何小部件分配给实例属性:
class Dialog(Toplevel):
def __init__(self, parent, title = None):
Toplevel.__init__(self, parent)
...
body = Frame(self)
...
self.buttonbox()
...
...
def buttonbox(self):
...
box = Frame(self)
w = Button(box, ...)
...
w = Button(box, ...)
...
...
每种方法的优点/缺点是什么?是否存在使用一种方法而不是另一种方法更有意义的情况?
答案 0 :(得分:1)
我的经验法则很简单:如果您以后需要引用它,请将其作为属性。如果没有,不要。
我不确定我是否能用这种方法列举任何利弊 - 既不保存所有参考文献也不保存你需要的参考文献特别好或坏,这主要是风格问题。
然而,有人说,为小部件制作属性可能意味着它在其他地方使用。如果它没有在其他地方使用,人们可能会推断出你的代码是不正确的。
答案 1 :(得分:0)
很多时候,在将窗口小部件添加到窗口并将其与事件连接后,您将不需要引用窗口小部件;在这些情况下,窗口小部件不会最终作为属性。此外,如果容器是动态的,则不会将窗口小部件设置为属性(因为您事先不会知道该对象将具有的窗口小部件)。
如果容器是静态的,并且您知道以后需要引用该窗口小部件,则可以将其设置为对象属性;这将使类的其他部分中的窗口小部件的引用变得清晰和紧凑。