Self относится к суперклассу, а не к подклассу - PullRequest
0 голосов
/ 22 мая 2019

Этот код выдаст ошибку 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 ]

2 голосов
/ 22 мая 2019

Вы не используете классы должным образом. Вы не должны переназначать self в этом утверждении:

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

С этим вы создали два виджета древовидной структуры - экземпляр MyTreeView и внутреннее древовидное представление. Это потому, что MyTreeView само по себе Treeview, поскольку вы наследуете от Treeview. Это называется это отношение, потому что MyTreeView это Treeview.

Вам нужно удалить эту строку кода.

Вам также необходимо передать хотя бы некоторые аргументы в конструктор супер:

super(MyTreeView, self).__init__(frame, columns=my_column_headers)
0 голосов
/ 22 мая 2019

Расширение на Ответ Брайана , поскольку вы унаследовали Treeview() для своего MyTreeView() класса, тогда сам класс является Treeview и имеет все функции виджета Treeview. При наследовании виджета Tkinter вы должны передать аргументы этого виджета конструктору __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 в качестве параметра функции.

Я изменил ваш класс, я могу понять из приведенного кода.

class MyTreeView(ttk.Treeview):
    def __init__(self, master=None, my_list=[], **kw):
        super(MyTreeView, self).__init__(master=master, **kw)

        # 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))

        self.bind("<Double-1>", self.OnFeatureDoubleClick)

    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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...