2016-08-02 47 views
0

這是我正在使用的treeview,以顯示來自多個來源的文本(使用打開文件對話框的文件)。它也應該有編輯行的能力。 (如有的bookstore /= entries的大小,我已經清除他們使它更短不介意)將索引添加到樹視圖的每一行

class treeview(): 
    full_list = [] 
    booklist = [] 
    indxcount = 0 
    bookstore = Gtk.ListStore(int, str, str, str, str, str, str, str,        
           str, str, str, str) 
    viewstore = Gtk.ListStore(str, str) 
    entries = ["Type", "Id", "Title", "Author", "Journal", "Year", "Publisher", 
       "Page", "Address", "Annote", "Booktitle", "Chapter"] 

    def __init__(self): 
     self.cell = cell.cell_renderer() 
     self.view = Gtk.TreeView(model=self.bookstore) 
     for i, column_title in enumerate(["Type", "Key", "Title", 
             "Author", "Journal", "Year"]): 
      renderer = Gtk.CellRendererText() 
      renderer.set_property("wrap-width", 300) 
      if i > 3: 
       renderer.set_property("wrap-width", 100) 
      renderer.set_property("wrap-mode", 0) 
      column = Gtk.TreeViewColumn(column_title, renderer, text=i+1) 
      self.view.append_column(column) 
      # column.clear() 
      for cid in range(0, 6): 
       column.set_sort_column_id(cid) 

    def viewer(self, booklist, act=-1): 
     for ref in booklist: 
      lref = list(ref) 
      treeview.indxcount += 1 
      lref = list(ref) 
      lref.insert(0, (treeview.indxcount)) 

      self.bookstore.append(lref) 
      treeview().full_list.append(ref) 


     self.current_filter_language = None 

的問題是,因爲我把行索引人爲,其給予更多的問題,那麼解決方案(例如,如果我重新打開另一個文件treeview.indxcount = last indxcount of previously open files + 1)。

但是由於它是從文件打開,我不能從gtk_tree_selection_get_selected_rows得到indx。那麼,我如何獲得索引?

另一個潛在的功能可能是GtkTreeCellDataFunc(),但我不知道如何使用,所以我沒有管理它。

請幫忙。

到jcoppens的答覆:嗨, 把一個完整的例子是應該打開一個文件有點棘手(將包括一個文件打開對話和一個完整的窗口),這可能會有更多的小例子。

但是,在排序上,我的問題是treeview.indxcount += 1行。請允許我更詳細地解釋問題:

說,我從包含6個項目的文件(so,len(booklist)=6)讀取數據。因此,完成此步驟後,treeview.indxcount = 6

現在,請考慮,我正在加載另一個這樣的文件,它將覆蓋現有的數據。但是,在這種情況下,treeview.indxcount將從7開始。我試圖將treeview.indxcount = 0放入FileOpenDialog,但不知何故,這不會影響觀看者。

所以,簡單地說,我試圖在數據被加載時計算treeview中的行數。

我不知道這個解釋是否清除了事情,或不。

+0

我並不完全相信我會遇到問題。一個簡單的操作例子會很有用。你有沒有考慮只使用Python屬性? – jcoppens

回答

0

你的代碼有一些問題。你的班級被稱爲treeview,但它不是一個樹形視圖。也許更好的(容易混淆),如果你從Gtk.Treeview這樣得出的:

class treeview(Gtk.TreeView): 
    def __init__(self): 
     super(treeview, self).__init__() 
     bookstore = Gtk.ListStore(int, str, str, str, str, str, str, str,        
            str, str, str, str) 
     self.set_model(self.bookstore) 

     for i, column_title in enumerate(["Type", "Key", "Title", 
            "Author", "Journal", "Year"]): 
      renderer = Gtk.CellRendererText() 
      renderer.set_property("wrap-width", 100 if i > 3 else 300) 
      renderer.set_property("wrap-mode", 0) 
      column = Gtk.TreeViewColumn(column_title, renderer, text=i) 
      self.append_column(column) 
      for cid in range(0, 6): 
       column.set_sort_column_id(cid) 
... 

現在,self實際上是指一個TreeView。然後,在方法viewer中,遞歸調用textview(),創建該類的新實例。這似乎很危險。

booklist的格式是什麼?如果您將書籤作爲一系列序列(例如元組的元組或列表的列表)傳遞,其中每個內部序列都是要在TreeView中顯示的行,那麼(我認爲)您不需要indexcnt 。

你會碰到這樣的:

tv = treeview() 
tv.viewer([["1984", "Asimov"], 
      ["Tcl and Tk", "Welch"], 
      ["Linear systems", "Moriarty"]]) 

這只是一個局部的答案 - 但我真的不能在「評論」格式代碼。如有必要,我會編輯它。