插入后自动对ttk树视图中的条目进行排序

时间:2017-10-16 09:28:23

标签: python-3.x treeview ttk

有没有办法在这篇文章python ttk treeview sort numbers中获得类似的结果,但没有按下标题?最好的方法是在插入一个项目后立即。

2 个答案:

答案 0 :(得分:0)

要在每个新项目插入后对Treeview进行排序,只需在代码中的正确位置添加对排序函数的显式调用。

示例代码:

import tkinter as tk
from tkinter import ttk

counter = 0
numbers = ['1', '10', '11', '2', '3', '4', '24', '12', '5']

def sort_treeview():
    content = [(tv.set(child, column), child) 
                                for child in tv.get_children('')]
    try:
        content.sort(key=lambda t: int(t[0]))
    except:
        content.sort()
    for index, (val, child) in enumerate(content):
        tv.move(child, '', index)

def add_item():
    global counter
    if counter < 8:
        tv.insert('', 'end', values=numbers[counter])
        counter += 1
        # Sort the treeview after the new item was inserted
        # -------------------------------------------------
        sort_treeview()

root = tk.Tk()
column = 'number'
tv = ttk.Treeview(root, columns=column, show='headings')
tv.pack()

button = tk.Button(root, text='Add entry', command=add_item)
button.pack()

root.mainloop()

答案 1 :(得分:0)

如果每次插入新项目时都要对内容进行排序,那么一种更有效的方法是将项目插入正确的位置,而不是对每次插入的全部数据进行排序。

这是使用标准foo <- function(x, description={if(x>0) v <- "pos" else v <-"non-pos"; v}) { cat(x, description, "\n") } 模块实现此目标的一种方法,该模块的bisect函数为您提供了应在bisect(a, x)中插入x以保持顺序的索引( a被假定为已排序)。在下面的示例中:

  • 我的整个界面存储在某个类a中;
  • 我的树视图称为GUI,仅包含一列;
  • 我的self.tree方法在树的某个类别下插入新行(由insert_item指向),并且每个类别下的项目都必须在我的应用程序中单独排序,这就是为什么我只检索该类别的孩子。
location