파이썬 TTK TreeView 정렬 숫자
문제
나는이 질문에 대한 답변에 설명 된 ttk.treeview 정렬 함수를 사용하려고합니다 ( TKTreeView 열 정렬 )를 사용하면 'abc', 'bcd', 'cde'등 문자열에 대해 잘 작동하지만 숫자를 정렬하려고 할 때 다음과 같이 끝납니다.
1
10
11
2
3
...
.
출력이 :
에 따라 데이터를 정렬하고 싶습니다.1
2
3
...
10
11
.
TreeView 열의 값이 문자열이며 정렬하기 전에 정수로 변환해야 할 가능성이 가장 큰 것임을 알고 있습니다.
해결책
list.sort
메소드, generacodicicetagcode 기능 선택적 sorted
매개 변수를 허용합니다.함수의 반환 값은 비교 키로 사용됩니다.
TreeView 항목을 숫자로 변환하는 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()
.
다른 팁
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))
It took me a while to find a variant of this answer, but I thought I would post an answer for those looking to sort dates as a string (i.e. '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))
제휴하지 않습니다 StackOverflow