在 .NET 中,有 ListView 控件,它显示带有可点击列标题的多列项目列表,可用于按列按升序或降序对列表进行排序。我需要一个具有完全相同行为的可滚动 Tkinter 小部件,但标准 Tkinter 模块中似乎没有任何具有类似功能的东西。这似乎是一个奇怪的疏忽。有没有像这样的小部件的模块?最需要跨平台解决方案,但最重要的是小部件在 Windows(XP 和 7)上运行良好。
我试图得到一个简单的ttk TreeView表,使用标题'command'标签进行每列排序,但它似乎不正常.我正在使用这个问题的答案来实现功能:Tk treeview列排序
我的代码:
import tkinter as tk
from tkinter import ttk
def treeview_sort_column(tv, col, reverse):
print('sorting %s!' % col)
l = [(tv.set(k, col), k) for k in tv.get_children('')]
l.sort(reverse=reverse)
# rearrange items in sorted positions
for index, (val, k) in enumerate(l):
print('Moving Index:%r, Value:%r, k:%r' % (index, val, k))
tv.move(k, '', index)
# reverse sort next time
tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))
cols = ('name', 'path', 'time', 'pb')
root = tk.Tk()
root.geometry("700x500")
listbox = ttk.Treeview(root, columns=cols, show="headings") …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此问题的答案(Tk树视图列排序)中说明的ttk.Treeview排序函数,它适用于像'abc','bcd','cde'等字符串,但是当我尝试对数字进行排序,最终显示如下:
1
10
11
2
3
...
Run Code Online (Sandbox Code Playgroud)
我想对数据进行排序,使输出为:
1
2
3
...
10
11
Run Code Online (Sandbox Code Playgroud)
我知道treeview列中的值是字符串,我很可能需要在排序之前将它们转换为整数,但我无法弄清楚如何做到这一点.
根据示例和亨利的帮助,我想出了以下代码来对 tkinter 树视图中的树进行排序,但它不起作用。我没有收到任何错误,但树未排序。任何帮助表示赞赏。
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))
def SortTree():
columns = ('#0',)
for col in columns:
tree.heading(col, text=col,
command=lambda c=col: treeview_sort_column(tree, c, False))
Run Code Online (Sandbox Code Playgroud)