PyGTK Treeview类
Treeview widget显示一个实现gtk.TreeModel接口的模型的内容。PyGTK provides the following types of models −
- gtk.ListStore
- gtk.TreeStore
- gtk.TreeModelSort
ListStore是一个列表模型。当与gtk.TreeView widget关联时,它产生一个包含要选择的项目的列表框。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是一个多列的Tree widget的模型。例如,下面的语句创建了一个有一列字符串项目的商店。
Store = gtk.TreeStore(gobject.TYPE_STRING)
为了在TreeStore中添加项目,使用append()方法。append()方法有两个参数,parent和row。要添加顶层项目,parent是None。
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,…)
除了标题和渲染器,它还需要0个或更多的属性=列对,以指定从哪个树模型列中获取属性的值。这些参数也可以用下面给出的TreeViewColumn类的方法来设置。
gtk.CellRenderer是一个基类,用于渲染不同类型的数据的一组对象。派生类是CellRendererText, CellRendererPixBuf 和 CellRendererToggle。
TreeViewColumn类的下列方法用于配置其对象–
- TreeViewColumn.pack_start(cell, expand = True) – 该方法将CellRenderer对象打包到起始列。如果expand参数被设置为True,列的整个分配空间将被分配给cell。
-
TreeViewColumn.add_attribute(cell, attribute, column) – 该方法在树列中的列表中添加一个属性映射。 该列 是树状模型的列。
-
TreeViewColumn.set_attributes() – 该方法使用 属性=列对 设置 渲染器 的属性位置。
-
TreeViewColumn.set_visible() – 如果 为真,则 树状视图列是可见的。
-
TreeViewColumn.set_title() – 该方法将 “title “属性设置为指定值。
-
TreeViewColumn.set_lickable() – 如果设置为True,标题可以获得键盘焦点,并被点击。
-
TreeViewColumn.set_alignment(xalign) – 该方法将 “alignment “属性设置为 xalign 的值 。
当用户点击treeviewcolumn 的标题按钮时,会发出 “clicked “信号。
配置好TreeViewColumn对象后,使用append_column()方法将其添加到TreeView widget中。
以下是TreeView类的重要方法 –
- TreevVew.set_model() – 这是为树状视图设置 “模型 “属性。如果树状视图已经有一个模型,这个方法将在设置新的模型之前删除它。如果 model 是 None ,它将取消设置旧的model。
-
TreeView.set_header_clickable() – 如果设置为True,列标题按钮可以被点击。
-
TreeView.append_column() – 将指定的 TreeViewColumn 追加到列的列表中。
-
TreeView.remove_column() – 这将从树状视图中删除指定的列。
-
TreeView.insert_column() – 将指定的 列 插入到树视图的位置上 。
TreeView widget发出以下信号 –
cursor-changed | 当光标移动或被设置时,会发出这个信号。 |
---|---|
expansion-collapse-cursor-row | 当光标处的行需要被扩展或折叠时,会发出这个信号。 |
row-activated | 当用户双击一个 树状视图 行时发出。 |
row-collapsed | 当一个行被用户或程序化的操作折叠时,会发出这个信息。 |
row-expanded | 当一个行通过用户或程序化操作被展开时,就会发出这个消息。 |
下面给出了两个TreeView widget的例子。第一个例子使用一个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显示为输出-