Viewing file: editable_cells.py (4.57 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/env python '''Tree View/Editable Cells
This demo demonstrates the use of editable cells in a GtkTreeView. If you're new to the GtkTreeView widgets and associates, look into the GtkListStore example first.''' # pygtk version: Maik Hertha <maik.hertha@berlin.de>
import gobject import gtk
# columns ( COLUMN_NUMBER, COLUMN_PRODUCT, COLUMN_EDITABLE ) = range(3)
# data articles = [ [ 3, "bottles of coke", True ], [ 5, "packages of noodles", True ], [ 2, "packages of chocolate chip cookies", True ], [ 1, "can vanilla ice cream", True ], [ 6, "eggs", True ] ]
class EditableCellsDemo(gtk.Window): def __init__(self, parent=None): gtk.Window.__init__(self) try: self.set_screen(parent.get_screen()) except AttributeError: self.connect('destroy', lambda *w: gtk.main_quit()) self.set_title(self.__class__.__name__) self.set_border_width(5) self.set_default_size(320, 200)
vbox = gtk.VBox(False, 5) self.add(vbox)
label = gtk.Label("Shopping list (you can edit the cells!)") vbox.pack_start(label, False, False)
sw = gtk.ScrolledWindow() sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) vbox.pack_start(sw)
# create model model = self.__create_model()
# create tree view treeview = gtk.TreeView(model) treeview.set_rules_hint(True) treeview.get_selection().set_mode(gtk.SELECTION_SINGLE)
self.__add_columns(treeview)
sw.add(treeview)
# some buttons hbox = gtk.HBox(True, 4) vbox.pack_start(hbox, False, False)
button = gtk.Button(stock=gtk.STOCK_ADD) button.connect("clicked", self.on_add_item_clicked, model) hbox.pack_start(button)
button = gtk.Button(stock=gtk.STOCK_REMOVE) button.connect("clicked", self.on_remove_item_clicked, treeview) hbox.pack_start(button)
self.show_all()
def __create_model(self):
# create list store model = gtk.ListStore( gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN )
# add items for item in articles: iter = model.append()
model.set (iter, COLUMN_NUMBER, item[COLUMN_NUMBER], COLUMN_PRODUCT, item[COLUMN_PRODUCT], COLUMN_EDITABLE, item[COLUMN_EDITABLE] ) return model
def __add_columns(self, treeview):
model = treeview.get_model()
# number column renderer = gtk.CellRendererText() renderer.connect("edited", self.on_cell_edited, model) renderer.set_data("column", COLUMN_NUMBER)
column = gtk.TreeViewColumn("Number", renderer, text=COLUMN_NUMBER, editable=COLUMN_EDITABLE) treeview.append_column(column)
# product column renderer = gtk.CellRendererText() renderer.connect("edited", self.on_cell_edited, model) renderer.set_data("column", COLUMN_PRODUCT)
column = gtk.TreeViewColumn("Product", renderer, text=COLUMN_PRODUCT, editable=COLUMN_EDITABLE) treeview.append_column(column)
def on_add_item_clicked(self, button, model): new_item = [0, "Description here", True] articles.append(new_item)
iter = model.append() model.set (iter, COLUMN_NUMBER, new_item[COLUMN_NUMBER], COLUMN_PRODUCT, new_item[COLUMN_PRODUCT], COLUMN_EDITABLE, new_item[COLUMN_EDITABLE] )
def on_remove_item_clicked(self, button, treeview):
selection = treeview.get_selection() model, iter = selection.get_selected()
if iter: path = model.get_path(iter)[0] model.remove(iter)
del articles[ path ]
def on_cell_edited(self, cell, path_string, new_text, model):
iter = model.get_iter_from_string(path_string) path = model.get_path(iter)[0] column = cell.get_data("column")
if column == COLUMN_NUMBER: articles[path][COLUMN_NUMBER] = int(new_text)
model.set(iter, column, articles[path][COLUMN_NUMBER])
elif column == COLUMN_PRODUCT: old_text = model.get_value(iter, column) articles[path][COLUMN_PRODUCT] = new_text
model.set(iter, column, articles[path][COLUMN_PRODUCT])
def main(): EditableCellsDemo() gtk.main()
if __name__ == '__main__': main()
|