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 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。 要添加顶级项目,父级为无。
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,…)
除了 title 和 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() − 此方法将"title"属性设置为指定的值。
TreeViewColumn.set_lickable() − 如果设置为 True,标题可以获得键盘焦点并被单击。
TreeViewColumn.set_alignment(xalign) − 该方法将"alignment"属性设置为 xalign 的值。
当用户单击 treeviewcolumn 标题按钮时,将发出"clicked"信号。
在配置 TreeViewColumn 对象后,使用 append_column() 方法将其添加到 TreeView 小部件。
下面是TreeView类的重要方法 −
TreevVew.set_model() − 这为 treeview 设置了"model"属性。 如果 treeview 已经有一个模型集,这个方法将在设置新模型之前删除它。 如果 model 为 None,它将取消设置旧模型。
TreeView.set_header_clickable() − 如果设置为 True,则可以单击列标题按钮。
TreeView.append_column() − 这会将指定的 TreeViewColumn 附加到 columns 列表。
TreeView.remove_column() − 这将从树视图中删除指定的列。
TreeView.insert_column() − 这会将指定的 column 插入树视图中由 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 对象添加到固定容器中,将其放置在顶层窗口中。
示例 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 显示为输出 −