我已经找到了解决方案,通过使用Gtk.TreeSortable.set_sort_func()
:
listStore = gtk.ListStore(str, str, str, str, str, str, str, str)
listStore.set_sort_func(0, date_compare, None)
treeview = gtk.TreeView()
treeview.set_model(listStore)
cell = gtk.CellRendererText()
column = gtk.TreeViewColumn('Date', cell, text=0)
column.set_sort_column_id(0)
treeview.append_column(column)
...
而且我写我date_compare
功能:
(也许它有一个最优雅的方式来写这date_compare
功能:我会很高兴听到你的:-))
def date_compare(model, row1, row2, user_data):
# Returns :
# - a negative integer if iter1 sorts before iter2,
# - zero if they are equal,
# - a positive integer if iter2 sorts before iter1.
sort_column, _ = model.get_sort_column_id()
date1 = model.get_value(row1, sort_column)
date2 = model.get_value(row2, sort_column)
# We split the date string to an array :
# 0 | 1 | 2 | 3 | 4
# day | month | hour | minutes | seconds
values1 = re.split("[ /:]", date1)
values2 = re.split("[ /:]", date2)
if values1[1] < values2[1] :
return -1
elif values1[1] == values2[1] : # same month => we compare by day
if values1[0] < values2[0] :
return -1
elif values1[0] == values2[0] : # same month and day => we compare by hour
if values1[2] < values2[2] :
return -1
elif values1[2] == values2[2] : # same month, day and hour => we compare by minute
if values1[3] < values2[3] :
return -1
elif values1[3] == values2[3] : # same month, day, hour and minute => we compare by second
if values1[4] < values2[4] :
return -1
elif values1[4] == values2[4] : # same month, day, hour, minute and second => it's same date !
return 0
else :
return 1
else :
return 1
else :
return 1
else :
return 1
else :
return 1
你的编辑听起来像你宁愿显示月份名称。如果存储日期时间实例而不是字符串,一切都会变得更加简单 – Tobias 2012-04-07 18:11:00
不是。我没有偏好。日期从syslog文件提供,所以月份是'Mmm'格式,这是英文缩写的月份,3个字符(1月,2月...)。将月份值存储为int应该允许我更容易地排序,但也具有通用性(不依赖于本地)的优点。 – 2012-04-08 12:04:19