Skip to content

Instantly share code, notes, and snippets.

@wusuopu
Created April 15, 2012 02:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wusuopu/2389339 to your computer and use it in GitHub Desktop.
Save wusuopu/2389339 to your computer and use it in GitHub Desktop.
pygtk TreeView example for all CellRenderer
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# @作者(author): 龙昌锦(LongChangjin)
# @博客(blog): http://www.xefan.com
# @邮箱(mail): admin@xefan.com
# @QQ: 346202141
# @时间(date): 2012-04-15
#
import sys
import os
try:
import pygtk
pygtk.require('2.0')
except:
pass
try:
import gtk
except:
sys.exit()
filexpm = [
"12 12 3 1",
" c #000000",
". c #ffff04",
"X c #b2c0dc",
"X XXX",
"X ...... XXX",
"X ...... X",
"X . ... X",
"X ........ X",
"X . .... X",
"X ........ X",
"X . .. X",
"X ........ X",
"X . .. X",
"X ........ X",
"X X"
]
under_started = gtk.gdk.pixbuf_new_from_xpm_data(filexpm)
comModel = gtk.ListStore(str)
comModel.append(['l1'])
comModel.append(['l2'])
comModel.append(['l3'])
class TreeViewPixbuf:
column_names = [u'项目名称', u'进度', u'Accel', u'项目类型', u'Combo', u'Spin', 'Spinner']
def __init__(self):
# Create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title(u'PyGTK中TreeView显示Pixbuf图标')
self.window.set_size_request(400, 300)
self.window.connect("delete_event", gtk.main_quit)
self.vbox = gtk.VBox(False, 0)
self.adjust = gtk.Adjustment(3, 0, 100, 2, 5, 0)
self.listmodel = self.make_list()
# create the TreeView
self.treeview = gtk.TreeView()
# create the TreeViewColumns to display the data
self.tvcolumn = [None] * len(self.column_names)
#gtk.CellRendererPixbuf 图像
cellpb = gtk.CellRendererPixbuf()
#cellpb.set_property('visible', False)
self.tvcolumn[0] = gtk.TreeViewColumn(self.column_names[0], cellpb, pixbuf=0)
#gtk.CellRendererToggle 开关按钮
cell = gtk.CellRendererToggle()
self.tvcolumn[0].pack_start(cell, False)
#cell.set_property("activatable", False)
self.tvcolumn[0].add_attribute(cell, "active", 1)
#cell.set_property("inconsistent", True)
#cell.set_property("indicator-size", 25)
cell.set_property("radio", True)
cell.connect("toggled", self.cellToggle)
self.treeview.append_column(self.tvcolumn[0])
#gtk.CellRendererProgress 进度条
cell = gtk.CellRendererProgress()
self.tvcolumn[1] = gtk.TreeViewColumn(self.column_names[1], cell, value=2)
self.treeview.append_column(self.tvcolumn[1])
#gtk.CellRendererAccel 获取按键
cell = gtk.CellRendererAccel()
self.tvcolumn[2] = gtk.TreeViewColumn(self.column_names[2], cell, text=3)
cell.set_property("accel-mode", gtk.CELL_RENDERER_ACCEL_MODE_OTHER)
cell.set_property("editable", True)
cell.connect("accel-edited", self.cellAccelEdit)
self.treeview.append_column(self.tvcolumn[2])
#gtk.CellRendererText 文本
cell = gtk.CellRendererText()
cell.set_property("editable", True)
cell.connect("edited", self.cellTextEdit)
self.tvcolumn[3] = gtk.TreeViewColumn(self.column_names[3], cell, text=4)
self.treeview.append_column(self.tvcolumn[3])
#gtk.CellRendererCombo 下拉输入框
cell = gtk.CellRendererCombo()
self.tvcolumn[4] = gtk.TreeViewColumn(self.column_names[4], cell, text=5)
cell.set_property("model", comModel)
cell.set_property("has-entry", True)
cell.set_property("text-column", 0)
cell.set_property("width", 50)
cell.set_property("editable", True)
cell.connect("changed", self.cellComboChanged)
self.treeview.append_column(self.tvcolumn[4])
#gtk.CellRendererSpin
cell = gtk.CellRendererSpin()
self.tvcolumn[5] = gtk.TreeViewColumn(self.column_names[5], cell, text=6)
cell.set_property("adjustment", self.adjust)
cell.set_property("editable", True)
cell.set_property("climb-rate", 1.5)
cell.connect("edited", self.cellSpinEdit)
self.treeview.append_column(self.tvcolumn[5])
#gtk.CellRendererSpinner 旋转;Loading...
cell = gtk.CellRendererSpinner()
self.tvcolumn[6] = gtk.TreeViewColumn(self.column_names[6], cell, pulse=7)
cell.set_property("active", True)
cell.set_property("size", gtk.ICON_SIZE_BUTTON)
self.treeview.append_column(self.tvcolumn[6])
self.scrolledwindow = gtk.ScrolledWindow()
self.scrolledwindow.add(self.treeview)
self.vbox.pack_start(self.scrolledwindow)
self.window.add(self.vbox)
self.treeview.set_model(self.listmodel)
self.window.show_all()
def make_list(self):
listmodel = gtk.ListStore(gtk.gdk.Pixbuf, bool, int, str, str, str, float, int)
for i in range(10):
listmodel.append([under_started, True, 50, 'Q', 'type', 'Com', 11, 0])
return listmodel
#cellText edit
def cellTextEdit(self, cell, path, new_text, data=None):
i = self.listmodel.get_iter(path)
t = self.listmodel.get_value(i, 4)
self.listmodel.set_value(i, 4, new_text)
#cellSpin edit
def cellSpinEdit(self, cell, path, new_text, data=None):
i = self.listmodel.get_iter(path)
t = self.listmodel.get_value(i, 6)
try:
v = float(new_text)
except ValueError, e:
return
self.listmodel.set_value(i, 6, v)
#cellCombo changed
def cellComboChanged(self, com, path, new_iter, data=None):
i = self.listmodel.get_iter(path)
v = comModel.get_value(new_iter, 0)
self.listmodel.set_value(i, 5, v)
#cellToggle clicked
def cellToggle(self, cell, path, data=None):
i = self.listmodel.get_iter(path)
t = self.listmodel.get_value(i, 1)
p = self.listmodel.get_value(i, 2)
r = self.listmodel.get_value(i ,7)
s = self.listmodel.get_value(i ,6)
self.listmodel.set_value(i, 1, not t)
self.listmodel.set_value(i, 2, p+1)
self.listmodel.set_value(i, 6, s+1)
self.listmodel.set_value(i, 7, r+1)
#cellAccel edit
def cellAccelEdit(self, cell, path, accel_key, accel_mods, key_code, data=None):
i = self.listmodel.get_iter(path)
print accel_key, accel_mods, key_code
print type(accel_key), type(accel_mods), type(key_code)
name = gtk.gdk.keyval_name(accel_key)
self.listmodel.set_value(i, 3, name)
def main():
gtk.main()
if __name__ == '__main__':
treeview = TreeViewPixbuf()
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment