此代码将产生错误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"))
答案 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