我试图使用标题'command'标记来获得一个简单化的ttk TreeView表,并按列排序,但它似乎不能正常工作。我使用这个问题的答案来实现功能:Tk treeview column sort
我的代码: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")
for each in ('name', 'path', 'time','pb'):
listbox.heading(each,text=each.capitalize(),command=lambda: treeview_sort_column(listbox, each, False))
listbox.column( each, width=tk.font.Font().measure(each.title() ))
if not each == 'path':
listbox.column(each,stretch=False)
if not each == 'name':
listbox.column( each, anchor='center')
listbox.pack(expand=True, fill=tk.BOTH)
root.mainloop()
我遇到的问题是,每次我运行它时,它只按最后一列排序,而不是按您单击的列(通过treeview_sort_column函数中的print语句进行验证)。在结果窗口中单击任何列得到的输出:
^{pr2}$
如果我将for循环中每个命令的动态创建更改为显式创建,方法是在循环之后添加此命令,那么它将按预期工作(即每列自行排序)。在listbox.heading('name', command=lambda: treeview_sort_column(listbox, 'name', False))
listbox.heading('path', command=lambda: treeview_sort_column(listbox, 'path', False))
listbox.heading('time', command=lambda: treeview_sort_column(listbox, 'time', False))
listbox.heading('pb', command=lambda: treeview_sort_column(listbox, 'pb', False))
产生:sorting name!
sorting name!
sorting path!
sorting path!
sorting time!
sorting time!
sorting pb!
sorting pb!
显然这是一个非常简单的例子,我的最后一个应用程序实际上在列中插入了数据(也有更多的列),但是由于我甚至不能让这个简化版本工作,我不知所措。我的循环有什么问题导致lambda函数出错?在
我的系统:Windows 7,64位
Python 3.3.2