Python Tkinter和继承奇怪的行为

时间:2012-12-19 12:56:33

标签: python inheritance tkinter options init

我在python和Tkinter中有一个行为我不明白。 我定义了自己的帧类,并希望设置某些选项,如borderwidth和relief,以便我定义的每个帧都使用这些设置。 我做了

from Tkinter import *

class BaseFrame(Frame):
    def __init(self,master=None,cnf={}):
        Frame.__init__(self, master,cnf)

def main():
    root = Tk()

    f = BaseFrame(root)
    l1 = Label(f,text='test')
    l2 = Label(f,text='longtext')
    l1.pack()
    l2.pack()
    f.pack()
    root.mainloop()

if __name__ == '__main__':
    main()

现在一切都符合预期。现在我尝试将设置添加到BaseFrame,因此每个帧都会传递这些设置。

我已加入 init 功能:

self.configure(bg='red')

并且感到惊讶,因为这个指令似乎完全被班级忽略了。 如果我在f:

的创建调用中添加一个选项bg ='red'
f = BaseFrame(root,bg='red')

它有效。

Frame.configure(self,bg='red')

也不起作用,以及其他一些奇怪的结构。无论我尝试什么,我只能在创建对象时设置设置。在 init 功能中执行此表单似乎不起作用。

现在,我该如何设置选项?我想念一些基本的东西吗?

感谢您的协助。

1 个答案:

答案 0 :(得分:4)

假设您问题中的代码是您的实际代码,则永远不会调用__init函数,因为它被称为__init而不是__init__。每次调用BaseFrame(stuff)时,实际上都在调用超级构造函数,即Frame(stuff),因为没有为BaseFrame定义专门的构造函数。

此外,如果您想允许BaseFrame(bg='red')之类的内容,则必须将最后一个构造函数参数更改为**cnf而不是cnf={}