FAQ Index - Search - Recent Changes - Everything - Add entry

<< Previous Entry | FAQ Entry 13.60 | Next Entry >>

13.60. How do I end editing immediately after an item is selected in a CellRendererCombo?

Ending editing of a gtk.CellRendererCombo immediately after an item is selected is a two stage process.

In the first stage, you must capture the combo itself, since it is not accessible later. To capture the combo, connect to the `editing-started` gtk.CellRenderer signal. You may define the connection in Glade or create it manually in code.

In the second stage, emit a `focus-out-event` in a `changed` signal handler for gtk.CellRendererCombo.

Here is sample code to demonstrate:

  import pygtk
  pygtk.require('2.0')
  import gtk
  import gobject

  class AutoEndingComboDemo(object):
    def __init__():
      self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
      self.window.set_size_request(500, 500)
      self.window.connect('destroy', lambda w: gtk.main_quit())
      self.comboModel = gtk.Liststore(gobject.TYPE_STRING)
      self.comboModel.append(['Item 1'])
      self.comboModel.append(['Item 2'])
      self.comboModel.append(['Item 3'])
      self.treeModel = gtk.Liststore(gobject.TYPE_STRING)
      self.treeModel.append()

      crc = gtk.CellRendererCombo()
      crc.set_property('model', self.comboModel)
      crc.set_property('text-column', 0)
      crc.set_property('editable', True)
      crc.set_property('has_entry', False)
      crc.connect('changed', self.comboChanged)
      crc.connect('editing-started', self.editingStarted)
      crc.connect('edited', self.edited, self.treeModel, 0)

      cl = gtk.TreeViewColumn('Select One', crc, text=0)

      self.treeView = gtk.TreeView(self.treeModel)
      treeView.append_column(cl)

      self.window.add(self.treeView)
      self.window.show()

      self.comboEditable = None

    def comboChanged(self, cell, path, newiter):
      e = gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE)
      e.window = self.treeView.window
      e.send_event = True
      e.in_ = False
      self.comboEditable.emit('focus-out-event', e)

    def editingStarted(self, cell, editable, path):
      self.comboEditable = editable

    def edited(self, cell, path, newtext, model=None, columnNumber=0):
      model[path][columnNumber] = newtext

  if __name__ == "__main__":
    app = AutoEndingComboDemo()
    gtk.main()

PyGTK FAQ Wizard | PyGTK Homepage | Feedback to faq at pygtk.org