自我是指超类而不是子类

时间:2019-05-22 15:55:48

标签: python-3.x tkinter

此代码将产生错误AttributeError: 'Treeview' object has no attribute 'OnFeatureDoubleClick',因为self引用了超类,而不是OnFeatureDoubleClick所在的子类。
我该怎么做?

class MyTreeView (ttk.Treeview):

    def __init__ ( self, frame, my_column_headers, my_list):

        super(MyTreeView, self).__init__()

        print ("MyTreeView.__init__")

        self=ttk.Treeview(frame) # create the widget

        self["columns"]=my_column_headers

        # Level 1
        PARENT="" # top level
        INDEX = 1 # insert at end
        i = 0
        for thing in my_list:
            self.insert(PARENT, INDEX, i, text=str(i), values=(thing))
            i += 1

        self["show"] = ["headings"] # don't show first column     
        self.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=TRUE)
        # self is the super class tkinter.ttk.Treeview, 
        # so it will give error AttributeError: 'Treeview' object has no attribute 'OnFeatureDoubleClick' when clicked 
        self.bind("<Double-1>", lambda event : self.OnFeatureDoubleClick(event))

    def OnFeatureDoubleClick(self, event):
        print ("MyTreeView.OnFeatureDoubleClick: self: " + str(self))
        print ("MyTreeView.OnFeatureDoubleClick: event: " + str(event) + "\t" + str(event.x) +  "\t" + str(event.y))
        item = self.identify('item', event.x, event.y)
        print("MyTreeView.OnFeatureDoubleClick: ", self.item(item,"text"))

2 个答案:

答案 0 :(得分:2)

您没有正确使用类。您不应在此语句中重新分配self

self=ttk.Treeview(frame) # create the widget

这样,您已经创建了两个树视图小部件-MyTreeView的实例和一个内部树视图。这是因为MyTreeView本身就是Treeview,因为您继承自Treeview。之所以称为关系,是因为MyTreeView Treeview

您需要删除该行代码。

您还需要至少将一些参数传递给超级构造函数:

super(MyTreeView, self).__init__(frame, columns=my_column_headers)

答案 1 :(得分:0)

Brayan's answer上进行扩展,因为您已经将Treeview()继承到MyTreeView()类,则该类本身是Treeview并具有{{1}的所有功能}小部件。继承Tkinter的小部件时,如果要提供小部件的参数,则必须将该小部件的参数提供给Treeview构造函数。例如,__init__小部件具有这些Treeview自变量,因此它就像...

(master=None, **kw)

class MyTreeView(ttk.Treeview): def __init__(self, master=None, my_list=[], **kw): super(MyTreeView, self).__init__(master=master, **kw) 是您提供的附加参数。另外,我没有给出my_list = []参数,因为在创建类似my_column_headers的类的实例时,它可以作为column=my_column_headers给出。

在第tree = MyTreeView(root, my_list=list, columns= my_column_headers)行,您也不需要self.bind("<Double-1>", lambda event : self.OnFeatureDoubleClick(event)),因为lambda的回调总是将事件作为参数传递给给定函数。如果您不想将bind作为参数传递给函数,则需要lambda

我从给定的代码中了解到,我修改了您的课程。

event