python ttk treeview sort numbers

前端 未结 4 1985
你的背包
你的背包 2020-12-06 23:26

I\'m trying to use the ttk.Treeview sort function illustrated in the answer to this question (Tk treeview column sort) and it works just fine for strings like \'abc\', \'bcd

相关标签:
4条回答
  • 2020-12-06 23:27

    It took me a while to find a variant of this answer, but I thought I would post an answer for those looking to sort dates as a string (i.e. '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))  
    
    0 讨论(0)
  • 2020-12-06 23:38

    list.sort method, sorted function accept optional key parameter. The return value of the function is used as comparison key.

    Specifying key function that convert the treeview item into number will solve your problem.

    Example:

    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

    0 讨论(0)
  • 2020-12-06 23:38

    I figure I'd add this bit of code for anyone wanting to use the above solution for both regular string sorts and numeric sorts.

    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 讨论(0)
  • 2020-12-06 23:42

    If someone is checking in 2020 and need to include float as well, then use this

    l.sort(key=lambda t: float(t[0]), reverse=reverse)
    
    0 讨论(0)
提交回复
热议问题