2012-04-04 63 views
1

我有gtk.ListStore附着到gtk.Treeview排序一个gtk.TreeColumn按日期值

gtk.ListStore的第一列是str类型并且包含一个日期值(日/ HH:MM:SS)

我要排序的第一个gtk.TreeviewColumn按日期等等,我写道:

listStore = gtk.ListStore(str, str, str, str, str, str, str, str) 
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) 

但排序不能正常工作:它排序天,而不是日期。

我该如何做按日期排序?

由于

编辑:

为了使分选容易,月值存储为数字(从01到12)。

+0

你的编辑听起来像你宁愿显示月份名称。如果存储日期时间实例而不是字符串,一切都会变得更加简单 – Tobias 2012-04-07 18:11:00

+0

不是。我没有偏好。日期从syslog文件提供,所以月份是'Mmm'格式,这是英文缩写的月份,3个字符(1月,2月...)。将月份值存储为int应该允许我更容易地排序,但也具有通用性(不依赖于本地)的优点。 – 2012-04-08 12:04:19

回答

0

我已经找到了解决方案,通过使用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 
+1

内置的cmp函数适用于序列并返回负值或正值:值1 [0],值1 [1] =值1 [1],值1 [0]返回cmp(values1,values2) – Tobias 2012-04-07 18:08:40

+0

我不知道如何使用它。你能解释或发布一个片段吗?谢谢 – 2012-04-08 12:50:21