Проблемы переопределения метода удаления на ttk.Treeview - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать подкласс ttk.Treeview в основном для того, чтобы сохранить список всех использованных iids в дереве.Поэтому я пытаюсь переопределить метод удаления, но получаю сообщение об ошибке, когда пытаюсь вызвать метод удаления супер.

Если я обошел удаление, то я не получаю ошибок.Но с этим я получаю эту ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__
    return self.func(*args)
  File "/home/sean/.PyCharmCE2018.1/config/scratches/scratch_1.py", line 12, in but_handle
    sl.delete(c)
  File "/home/sean/.PyCharmCE2018.1/config/scratches/scratch_1.py", line 8, in delete
    super(Tree, self).delete(self, items)
  File "/usr/lib/python3.5/tkinter/ttk.py", line 1219, in delete
    self.tk.call(self._w, "delete", items)
_tkinter.TclError: Item .140356823468016 not found

Вот код:

import tkinter as tk
from tkinter import ttk


class Tree(ttk.Treeview):
    s = 1
    def delete(self, *items):
        super(Tree, self).delete(self, *items) # Error occurs here

        # in use i will delete the iid from a list here

def but_handle():
    for c in sl.get_children():
        sl.delete(c)

if __name__ == '__main__':
    root = tk.Tk()

    but = tk.Button(command=but_handle)
    but.pack(side='top')
    sl = Tree()
    sl.pack()

    sl.insert('', 'end', None, text='a')
    sl.insert('', 'end', None, text='b')
    sl.insert('', 'end', None, text='c')
    sl.insert('', 'end', None, text='d')
    sl.insert('', 'end', None, text='e')

    root.mainloop()

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 10 мая 2018

self argument неявно и не должно указываться в вызове функции явно.

Позвонив по номеру super(Tree, self).delete(self, *items), вы говорите удалить self и ребенка, что, конечно, не получается.

Решение состоит в том, чтобы изменить delete позвонить на:

super(Tree, self).delete(*items)

...