- PyGTK 教程
 - PyGTK - 主页
 - PyGTK - 简介
 - PyGTK - 环境
 - PyGTK - 你好世界
 - PyGTK - 重要类
 - PyGTK - 窗口类
 - PyGTK - 按钮类
 - PyGTK - 标签类
 - PyGTK - 入门级
 - PyGTK - 信号处理
 - PyGTK - 事件处理
 - PyGTK - 容器
 - PyGTK - 盒子类
 - PyGTK - ButtonBox 类
 - PyGTK - 对齐类
 - PyGTK - EventBox 类
 - PyGTK - 布局类
 - PyGTK - 组合框类
 - PyGTK - ToggleButton 类
 - PyGTK - CheckButton 类
 - PyGTK - 单选按钮类
 - PyGTK - 菜单栏、菜单和菜单项
 - PyGTK - 工具栏类
 - PyGTK - 调整类
 - PyGTK - 范围类
 - PyGTK - 规模类
 - PyGTK - 滚动条类
 - PyGTK - 对话框类
 - PyGTK - 消息对话框类
 - PyGTK - AboutDialog 类
 - PyGTK - 字体选择对话框
 - PyGTK - 颜色选择对话框
 - PyGTK - 文件选择器对话框
 - PyGTK - 笔记本类
 - PyGTK - 框架类
 - PyGTK - AspectFrame 类
 - PyGTK - TreeView 类
 - PyGTK - 窗格类
 - PyGTK - 状态栏类
 - PyGTK - ProgressBar 类
 - PyGTK - 视口类
 - PyGTK - 滚动窗口类
 - PyGTK - 箭头类
 - PyGTK - 图像类
 - PyGTK - DrawingArea 类
 - PyGTK - SpinButton 类
 - PyGTK - 日历类
 - PyGTK - 剪贴板类
 - PyGTK - 标尺类
 - PyGTK - 超时
 - PyGTK - 拖放
 
- PyGTK 有用资源
 - PyGTK - 快速指南
 - PyGTK - 有用的资源
 - PyGTK - 讨论
 
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。要添加顶级项目,父级为“无”。
row1 = store.append(None, ['row1'])
您需要重复此语句来添加多行。
为了添加子行,请将顶级行作为父参数传递给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) - 此方法将属性映射添加到树列中的列表。该列是树模型的列。
TreeViewColumn.set_attributes() - 此方法使用attribute =列对设置渲染器的属性位置
TreeViewColumn.set_visible() - 如果为True,则树视图列可见
TreeViewColumn.set_title() - 此方法将“title”属性设置为指定的值。
TreeViewColumn.set_lickable() - 如果设置为 True,标题可以获取键盘焦点并被单击。
TreeViewColumn.set_alignment(xalign) - 此方法将“alignment”属性设置为xalign的值。
当用户单击树视图列标题按钮时,会发出“单击”信号。
配置 TreeViewColumn 对象后,使用append_column() 方法将其添加到 TreeView 小部件。
以下是 TreeView 类的重要方法 -
TreevVew.set_model() - 设置树视图的“模型”属性。如果树视图已经有模型集,此方法将在设置新模型之前将其删除。如果model为None,它将取消设置旧模型。
TreeView.set_header_clickable() - 如果设置为 True,则可以单击列标题按钮。
TreeView.append_column() - 这会将指定的TreeViewColumn附加到列列表中。
TreeView.remove_column() - 这将从树视图中删除指定的列。
TreeView.insert_column() - 这会将指定的列插入树视图中由位置指定的位置。
TreeView 小部件发出以下信号 -
| 光标改变 | 当光标移动或设置时会发出此信号。 | 
| 展开-折叠-光标行 | 当光标处的行需要展开或折叠时会发出此信号。 | 
| 行激活 | 当用户双击树视图行时会发出此信号 | 
| 行折叠 | 当用户或编程操作折叠行时会发出此消息。 | 
| 行扩展 | 当通过用户或编程操作扩展行时会发出此消息。 | 
下面给出了 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 对象添加到固定容器,将其放置在顶层窗口上。
实施例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 回调函数时,用户选择的项目将显示在窗口中的标签上。
实施例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 显示为输出 -
