Pygtk 简明教程

PyGTK - TreeView Class

Treeview 小组件显示实现 gtk.TreeModel 接口的模型的内容。PyGTK 提供以下类型的模型:

  1. gtk.ListStore

  2. gtk.TreeStore

  3. gtk.TreeModelSort

ListStore 是一个列表模型。当与 gtk.TreeView 小组件关联时,它会生成一个列表框,其中包含要从中选择的项目。gtk.ListStore 对象使用以下语法声明:

store = gtk.ListStore(column_type)

一个列表可能具有多列,预定义的类型常量为:

  1. gobject.TYPE_BOOLEAN

  2. gobject.TYPE_BOXED

  3. gobject.TYPE_CHAR

  4. gobject.TYPE_DOUBLE

  5. gobject.TYPE_ENUM

  6. gobject.TYPE_FLOAT

  7. gobject.TYPE_INT

  8. gobject.TYPE_LONG

  9. gobject.TYPE_NONE

  10. gobject.TYPE_OBJECT

  11. gobject.TYPE_STRING

  12. gobject.TYPE_UCHAR

  13. gobject.TYPE_UINT

  14. gobject.TYPE_ULONG

  15. gtk.gdk.pixbuf etc.

例如,声明一个用于存储字符串项目的 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 类的 USING 方法设置这些参数。

gtk.CellRenderer 是用于渲染不同类型数据的对象集合的基类。派生类是 CellRendererText、CellRendererPixBuf 和 CellRendererToggle。

TreeViewColumn 类的以下方法用于配置其对象−

  1. TreeViewColumn.pack_start(cell, expand = True) - 此方法将 CellRenderer 对象打包到开始列中。如果 expand 参数设置为 True,将为单元格分配整个分配的空间。

  2. TreeViewColumn.add_attribute(cell, attribute, column) - 此方法将属性映射添加到树列中的列表中。 column 是树模型的列。

  3. TreeViewColumn.set_attributes() - 此方法使用 attribute = column 对设置 renderer 的属性位置。

  4. TreeViewColumn.set_visible() - 如果 True, treeview 列可见

  5. TreeViewColumn.set_title() - 此方法将 "title" 属性设置为指定的值。

  6. TreeViewColumn.set_lickable() - 如果设置为 True,标题可以接受键盘焦点,并且可以被单击。

  7. TreeViewColumn.set_alignment(xalign) - 此方法将 "alignment" 属性设置为 xalign 的值。

当用户单击 treeviewcolumn 标题按钮时,会发出 "clicked" 信号。

在配置了 TreeViewColumn 对象之后,它将使用 append_column() 方法添加到 TreeView 小部件中。

以下为 TreeView 类的重要方法 -

  1. TreevVew.set_model() - 它为 treeview 设置“model”属性。如果 treeview 已有一个设置的模型,此方法会在设置新模型之前将其移除。如果 modelNone ,它将取消设置旧模型。

  2. TreeView.set_header_clickable() - 如果设置为 True,则可以单击列标题按钮。

  3. TreeView.append_column() - 它将指定的 TreeViewColumn 追加到列列表。

  4. TreeView.remove_column() - 它从 treeview 移除指定的列。

  5. 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)

TreeView Object通过将它添加到 Fixed 容器而被放置到最顶层的窗口中。

Example 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 callback 函数,用户选择的对象显示在窗口中的标签上。

treeview with liststore

Example 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