2014-02-26 2 views
2

이 질문에 대한 답변 (Tk treeview column sort)에 나와있는 ttk.Treeview 정렬 함수를 사용하려고하는데 'abc', 'bcd', 'cde'와 같은 문자열에 대해서는 정상적으로 작동합니다. 등,하지만 난 숫자를 정렬하려고 할 때이처럼 보여주는 끝 :python ttk treeview 정렬 번호

1 
10 
11 
2 
3 
... 
데이터는 정렬하는 I 출력이라고 싶습니다

:

1 
2 
3 
... 
10 
11 

내가 아는 treeview 열의 값이 문자열이고 이전에 정수로 변환해야 할 가능성이 가장 높습니다. 그러나 나는 그것을 어떻게하는지 이해할 수 없다.

답변

5

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: treeview_sort_column(treeview, col, False)) 

mainloop() 

enter image description here

+0

나는 그것이 단순 할 것이라고 알고있었습니다. 고맙습니다! – rhowe

3

는 내가 일반 문자열의 종류 및 숫자 종류 모두에 대한 위의 솔루션을 사용하고자하는 사람에 대한 코드의이 비트를 추가 할 것입니다 그림.

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

시간을내어이 수정 사항을 추가해 주셔서 감사합니다. –