python ttk treeview sort numbers python ttk treeview sort numbers tkinter tkinter

python ttk treeview sort numbers


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 ttkexcept ImportError:    from Tkinter import *    import ttkdef 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


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


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)