簡體   English   中英

對不同類型的 Tkinter Treeview 列進行排序

[英]Sorting Tkinter Treeview columns with different types

我最近在 Tkinter 中的 treeview 中添加了坐標和日期,當嘗試對坐標列中的實數和日期列中的日期進行排序時,我的排序現在失敗了。

我之前的排序 function 在下面,是專門為文本和整數設計的,但我現在需要升級它。 我確實看過另一篇使用 treeview class 升級的帖子,但如果可能的話,我更願意保留這部分代碼程序,而不是 OOP。

    def treeviewSort(treeview, column, reverse: bool):
    try:
        dataList = [
            (int(treeview.set(k, column)), k) for k in
            treeview.get_children("")
        ]
    except Exception:
        dataList = [(treeview.set(k, column), k) for k in
                    treeview.get_children("")]

    dataList.sort(reverse=reverse)

    for index, (val, k) in enumerate(dataList):
        treeview.move(k, "", index)

    treeview.heading(
        column=column,
        text=column.title(),
        command=lambda _col=column: treeviewSort(
            treeview, _col, not reverse
        ),
    )

columns = ("species", "location", "x", "y", "time",
           "date", "temperature", "humidity", "user", "#")
table = ttk.Treeview(frame, columns=columns, show="headings",
                     height=30)
for col in columns:
    table.heading(col, text=col,
                  command=lambda _col=col: treeviewSort(table, _col,
                                                        False))

以供參考:

  • 物種應該是文本
  • 位置應該是文本
  • 兩個坐標列都應該是浮點數/實數
  • 時間應該是 integer
  • 日期應該是日期時間
  • 溫度應該是一個整數
  • 濕度應該是浮動/真實的
  • 用戶應該是文本
  • 編號應該是 integer

我認為解決方案是在我的 function 中添加一個檢查器,它檢查列類型並進行相應的排序,但我不確定如何實現這一點。

通過根據我猜到的所選列添加 if 語句來解決此問題。 只是剛剛弄清楚如何去做。

如果數據在 x 或 y 列中,它會將數據變為浮點數,然后進行排序。 如果在日期列中,它使用 datetime.strptime 然后按日期排序。 否則,它會正常運行。 代碼如下,以防它幫助任何人。

    if column == "x" or column == "y":
        dataList.sort(reverse=reverse, key=lambda t: (float(t[0])))
    elif column == "date":
        dataList.sort(reverse=reverse,
                      key=lambda t: datetime.strptime(t[0], "%d/%m/%Y"))
    else:
        dataList.sort(reverse=reverse)

暫無
暫無

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

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