2014-02-26 308 views
2

我正在尝试使用这个问题的答案(Tk treeview column sort)中说明的ttk.Treeview排序功能,它适用于'abc','bcd','cde'等字符串,等等,但是当我尝试数字排序它结束了显示这样了:python ttk treeview排序数字

1 
10 
11 
2 
3 
... 

我想对数据进行排序,使得输出是:

1 
2 
3 
... 
10 
11 

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

回答

5

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

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

例子:

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: treeview_sort_column(treeview, col, False)) 

mainloop() 

enter image description here

+0

我知道这会很简单。谢谢! – rhowe

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))   
+0

感谢您花时间添加此修改。 –