OO GUI编程风格:将小部件分配给实例属性?

时间:2011-08-29 19:41:44

标签: user-interface coding-style

在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, ...)
        ...
    ...

问题陈述

每种方法的优点/缺点是什么?是否存在使用一种方法而不是另一种方法更有意义的情况?

2 个答案:

答案 0 :(得分:1)

我的经验法则很简单:如果您以后需要引用它,请将其作为属性。如果没有,不要。

我不确定我是否能用这种方法列举任何利弊 - 既不保存所有参考文献也不保存你需要的参考文献特别好或坏,这主要是风格问题。

然而,有人说,为小部件制作属性可能意味着它在其他地方使用。如果它没有在其他地方使用,人们可能会推断出你的代码是不正确的。

答案 1 :(得分:0)

很多时候,在将窗口小部件添加到窗口并将其与事件连接后,您将不需要引用窗口小部件;在这些情况下,窗口小部件不会最终作为属性。此外,如果容器是动态的,则不会将窗口小部件设置为属性(因为您事先不会知道该对象将具有的窗口小部件)。

如果容器是静态的,并且您知道以后需要引用该窗口小部件,则可以将其设置为对象属性;这将使类的其他部分中的窗口小部件的引用变得清晰和紧凑。