【问题标题】:Problems overriding delete method on ttk.Treeview在 ttk.Treeview 上覆盖删除方法的问题
【发布时间】:2018-05-10 04:27:01
【问题描述】:

我正在尝试创建 ttk.Treeview 的子类,主要是为了保留树中所有使用的 iid 的列表。所以我试图覆盖 delete 方法,但是当我尝试调用 super 的 delete 方法时,总是报错。

如果我绕过删除覆盖,那么我不会收到任何错误。 但是有了它,我得到了这个错误:

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

我在这里做错了什么?

【问题讨论】:

    标签: python python-3.x tkinter treeview ttk


    【解决方案1】:

    self argument 是隐式的,不应在函数调用中显式指定。

    通过调用super(Tree, self).delete(self, *items),您告诉删除self 和一个孩子,这当然会失败。

    解决方法是将delete调用改为:

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

    【讨论】:

    • 啊,有道理。谢谢
    【解决方案2】:
    self. tk. call(self._w, "delete", items)
    

    tkinter 。 TclError: 未找到第 0 项

    代码 定义视图(自我): self.tr.delete(0,END) 对于 i 在 p.select() 中:

              self.tr.insert('',END,values=i)
    

    【讨论】:

    • 欢迎来到 SO!当你要回答一个已经有公认答案的老问题(这个问题超过 2 岁)时(这里就是这种情况),请问问自己:我真的有实质性的改进吗?如果没有,请考虑不要回答。
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多