PyGTK - TreeView 類



TreeView 小部件顯示實現 gtk.TreeModel 介面的模型的內容。PyGTK 提供以下型別的模型:

  • gtk.ListStore
  • gtk.TreeStore
  • gtk.TreeModelSort

ListStore 是一個列表模型。當與 gtk.TreeView 小部件關聯時,它會生成一個列表框,其中包含要從中選擇的專案。gtk.ListStore 物件使用以下語法宣告:

store = gtk.ListStore(column_type)

列表可以有多個列,預定義的型別常量為:

  • gobject.TYPE_BOOLEAN
  • gobject.TYPE_BOXED
  • gobject.TYPE_CHAR
  • gobject.TYPE_DOUBLE
  • gobject.TYPE_ENUM
  • gobject.TYPE_FLOAT
  • gobject.TYPE_INT
  • gobject.TYPE_LONG
  • gobject.TYPE_NONE
  • gobject.TYPE_OBJECT
  • gobject.TYPE_STRING
  • gobject.TYPE_UCHAR
  • gobject.TYPE_UINT
  • gobject.TYPE_ULONG
  • gtk.gdk.pixbuf 等。

例如,宣告一個用於儲存字串專案的 ListStore 物件:

store = gtk.ListStore(gobject.TYPE_STRING

為了向儲存區新增專案,使用 append() 方法:

store.append (["item 1"])

TreeStore 是多列樹形小部件的模型。例如,以下語句建立一個只有一個列(包含字串項)的儲存區。

Store = gtk.TreeStore(gobject.TYPE_STRING)

為了向 TreeStore 新增專案,使用 append() 方法。append() 方法有兩個引數,parent 和 row。要新增頂級專案,parent 為 None。

row1 = store.append(None, ['row1'])

需要重複此語句以新增多行。

為了新增子行,將頂級行作為 parent 引數傳遞給 append() 方法:

childrow = store.append(row1, ['child1'])

需要重複此語句以新增多個子行。

現在,建立一個 TreeView 小部件並使用上面的 TreeStore 物件作為模型。

treeview = gtk.TreeView(store)

現在我們必須建立 TreeViewColumn 來顯示儲存資料。gtk.TreeViewColumn 的物件使用 gtk.CelRenderer 管理標題和單元格。TreeViewColumn 物件使用以下建構函式建立:

gtk.TreeViewColumn(title, cell_renderer,…)

除了標題和渲染器之外,它還接受零個或多個 attribute=column 對,以指定從哪個樹模型列檢索屬性的值。這些引數也可以使用下面給出的 TreeViewColumn 類的使用方法來設定。

gtk.CellRenderer 是用於渲染不同型別資料的物件集的基類。派生類包括 CellRendererText、CellRendererPixBuf 和 CellRendererToggle。

TreeViewColumn 類的以下方法用於配置其物件:

  • TreeViewColumn.pack_start(cell, expand = True) - 此方法將 CellRenderer 物件打包到列的開頭。如果 expand 引數設定為 True,則列的整個分配空間將分配給單元格。

  • TreeViewColumn.add_attribute(cell, attribute, column) - 此方法將屬性對映新增到樹列中的列表。column 是樹模型的列。

  • TreeViewColumn.set_attributes() - 此方法使用attribute = column 對設定renderer 的屬性位置。

  • TreeViewColumn.set_visible() - 如果為True,則 treeview 列可見。

  • TreeViewColumn.set_title() - 此方法將“標題”屬性設定為指定的值。

  • TreeViewColumn.set_clickable() - 如果設定為 True,則標題可以獲取鍵盤焦點並被單擊。

  • TreeViewColumn.set_alignment(xalign) - 此方法將“對齊”屬性設定為xalign 的值。

當用戶單擊treeviewcolumn 標題按鈕時,將發出“clicked”訊號。

配置 TreeViewColumn 物件後,可以使用 append_column() 方法將其新增到 TreeView 小部件。

以下是 TreeView 類的重要方法:

  • TreeView.set_model() - 這將設定 treeview 的“model”屬性。如果 treeview 已經設定了模型,則此方法將在設定新模型之前將其刪除。如果modelNone,它將取消設定舊模型。

  • TreeView.set_header_clickable() - 如果設定為 True,則可以單擊列標題按鈕。

  • TreeView.append_column() - 這會將指定的TreeViewColumn 附加到列列表。

  • TreeView.remove_column() - 這會從 treeview 中刪除指定的列。

  • TreeView.insert_column() - 這會將指定的column 插入到 treeview 中,位置由position 指定。

TreeView 小部件發出以下訊號:

cursor-changed 當游標移動或設定時發出此訊號。
expand-collapse-cursor-row 當需要展開或摺疊游標處的行時發出此訊號。
row-activated 當用戶雙擊treeview 行時發出此訊號。
row-collapsed 當用戶或程式操作摺疊行時發出此訊號。
row-expanded 當用戶或程式操作展開行時發出此訊號。

下面給出 TreeView 小部件的兩個示例。第一個示例使用 ListStore 生成簡單的 ListView。

這裡建立一個 ListStore 物件並將字串項新增到其中。此 ListStore 物件用作 TreeView 物件的模型:

store = gtk.ListStore(str)

treeView = gtk.TreeView()
treeView.set_model(store)

然後將 CellRendererText 新增到 TreeViewColumn 物件,並將其附加到 TreeView。

rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)

透過將其新增到 Fixed 容器,TreeView 物件放置在頂級視窗上。

示例 1

觀察以下程式碼:

import pygtk
pygtk.require('2.0')
import gtk

class PyApp(gtk.Window):
   def __init__(self):
      super(PyApp, self).__init__()
      self.set_title("TreeView with ListStore")
      self.set_default_size(250, 200)
      self.set_position(gtk.WIN_POS_CENTER)
		
      store = gtk.ListStore(str)
      store.append (["PyQt"])
      store.append (["Tkinter"])
      store.append (["WxPython"])
      store.append (["PyGTK"])
      store.append (["PySide"])
      
      treeView = gtk.TreeView()
      treeView.set_model(store)
		
      rendererText = gtk.CellRendererText()
      column = gtk.TreeViewColumn("Python GUI Libraries", rendererText, text=0)
      treeView.append_column(column)
      
      fixed = gtk.Fixed()
      lbl = gtk.Label("select a GUI toolkit")
      fixed.put(lbl, 25,75)
      fixed.put(treeView, 125,15)
		
      lbl2 = gtk.Label("Your choice is:")
      fixed.put(lbl2, 25,175)
      self.label = gtk.Label("")
		
      fixed.put(self.label, 125,175)
      self.add(fixed)
      
      treeView.connect("row-activated", self.on_activated)
      self.connect("destroy", gtk.main_quit)
      self.show_all()
		
   def on_activated(self, widget, row, col):
      
	  model = widget.get_model()
      text = model[row][0]
      self.label.set_text(text)
		
def main():
   gtk.main()
   return

if __name__ == "__main__":
   bcb = PyApp()
   main()

使用者選擇的專案顯示在視窗中的標籤上,因為呼叫了on_activated 回撥函式。

TreeView with ListStore

示例 2

第二個示例從 TreeStore 構建分層的 TreeView。該程式遵循構建儲存區、將其設定為 TreeView 的模型、設計 TreeViewColumn 並將其附加到 TreeView 的相同順序。

import gtk

class PyApp(gtk.Window):
   
   def __init__(self):
      super(PyApp, self).__init__()
      
	  self.set_title("TreeView with TreeStore")
      self.set_size_request(400,200)
      self.set_position(gtk.WIN_POS_CENTER)
      vbox = gtk.VBox(False, 5)
      
      # create a TreeStore with one string column to use as the model
      store = gtk.TreeStore(str)
      
      # add row
      row1 = store.append(None, ['JAVA'])
      
      #add child rows
      store.append(row1,['AWT'])
      store.append(row1,['Swing'])
      store.append(row1,['JSF'])
      
      # add another row
      row2 = store.append(None, ['Python'])
      store.append(row2,['PyQt'])
      store.append(row2,['WxPython'])
      store.append(row2,['PyGTK'])
      
      # create the TreeView using treestore
      treeview = gtk.TreeView(store)
      tvcolumn = gtk.TreeViewColumn('GUI Toolkits')
      treeview.append_column(tvcolumn)
		
      cell = gtk.CellRendererText()
      tvcolumn.pack_start(cell, True)
      tvcolumn.add_attribute(cell, 'text', 0)
      vbox.add(treeview)
		
      self.add(vbox)
      
	  self.connect("destroy", gtk.main_quit)
      self.show_all()

PyApp()
gtk.main()

以下 TreeView 顯示為輸出:

TreeView with TreeStore
廣告
© . All rights reserved.