簡體   English   中英

python ttk treeview排序數字

[英]python ttk treeview sort numbers

我正在嘗試使用這個問題的答案中說明的 ttk.Treeview 排序函數( Tk treeview 列排序),它適用於像“abc”、“bcd”、“cde”等字符串,但是當我嘗試對最終顯示的數字進行排序:

1
10
11
2
3
...

我希望對數據進行排序,以便輸出為:

1
2
3
...
10
11

我知道 treeview 列中的值是字符串,並且我很可能需要在排序之前將它們轉換為整數,但我不知道如何做到這一點。

list.sort方法, sorted函數接受可選的key參數。 函數的返回值用作比較鍵。

指定將樹視圖項轉換為數字的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()

在此處輸入圖片說明

我想我會為想要將上述解決方案用於常規字符串排序和數字排序的任何人添加這段代碼。

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

如果有人在 2020 年檢查並需要包括浮動,那么使用這個

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

我花了一段時間才找到這個答案的變體,但我想我會為那些希望將日期排序為字符串的人發布一個答案(即“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))  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM