python ttk treeview排序数字

时间:2014-02-26 04:58:01

标签: python sorting tkinter treeview ttk

我正在尝试使用此问题的答案(Tk treeview column sort)中说明的ttk.Treeview排序函数,它适用于'abc','bcd','cde'等字符串。 。但是当我尝试对数字进行排序时,它最终会显示出来:

1
10
11
2
3
...

我希望对数据进行排序,使输出为:

1
2
3
...
10
11

我知道treeview列中的值是字符串,我很可能需要在排序之前将它们转换为整数,但我无法弄清楚如何做到这一点。

4 个答案:

答案 0 :(得分:5)

list.sort方法,sorted函数接受可选的key参数。函数的返回值用作比较键。

指定将treeview项目转换为数字的key函数将解决您的问题。

示例:

try:
    from tkinter import *
    from tkinter import ttk
except ImportError:
    from Tkinter import *
    import ttk

def treeview_sort_column(tv, col, reverse):
    l = [(tv.set(k, col), k) for k in tv.get_children('')]
    l.sort(key=lambda t: int(t[0]), reverse=reverse)
    #      ^^^^^^^^^^^^^^^^^^^^^^^

    for index, (val, k) in enumerate(l):
        tv.move(k, '', index)

    tv.heading(col,
               command=lambda: treeview_sort_column(tv, col, not reverse))

root = Tk()
columns = ('number',)
treeview = ttk.Treeview(root, columns=columns, show='headings')
for t in ('1', '10', '11', '2', '3'):
    treeview.insert('', END, values=(t,))
treeview.pack()
for col in columns:
    treeview.heading(col, text=col,
                     command=lambda c=col: treeview_sort_column(treeview, c, False))

mainloop()

enter image description here

答案 1 :(得分:3)

我想我会为想要将常规字符串排序和数字排序使用上述解决方案的任何人添加这段代码。

def treeview_sort_column(tv, col, reverse):
    l = [(tv.set(k, col), k) for k in tv.get_children('')]
    try:
        l.sort(key=lambda t: int(t[0]), reverse=reverse)
        #      ^^^^^^^^^^^^^^^^^^^^^^^
    except ValueError:
        l.sort(reverse=reverse)

    for index, (val, k) in enumerate(l):
        tv.move(k, '', index)

    tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))        

答案 2 :(得分:0)

花了我一段时间才能找到该答案的变体,但是我想为那些希望将日期按字符串排序(即'DD / MM / YYYY')的人发布答案

import datetime

def treeview_sort_column(tv, col, reverse):
l = [(tv.set(k, col), k) for k in tv.get_children('')]
    l.sort(key=lambda: x, datetime.datetime.strptime(x[0], '%d/%m/%y'), reverse=reverse)

for index, (val, k) in enumerate(l):
    tv.move(k, '', index)

tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))  

答案 3 :(得分:0)

如果有人要在2020年进行检查,并且还需要包含float,则可以使用此

l.sort(key=lambda t: float(t[0]), reverse=reverse)