A hack would be: catch the 'key-press-event' if it is
gtk.gdk.keyval_from_name('Return') or
gtk.gdk.keyval_from_name('KP_Enter') then do you query, if not, then let
the widget handle the signal by itself (draw the text into the
combobox).

On the combo, you should always connect to activate instead changed.

On Wed, 2010-03-31 at 02:11 +1100, Neil Dugan wrote:
> Osmo Maatta wrote:
> > Hello,
> > 
> > I have a small application that has a search-field (gtk.ComboBoxEntry) 
> > and a button to start a search job.
> > 
> > The application will start a new search if user:
> > 1) Selects an item from the gtk.ComboBoxEntry's drop-down list.
> >     This is handled by gtk.ComboBoxEntry's "changed" event. This is Ok.
> > 
> > 2  Types a search query (some text) and presses the [Start search] button.
> >     This is handled by the button's "clicked" event. This is Ok.
> > 
> > 3) Presses the [Enter]-key.
> >     This is handled by the combo's "activate" event attached to the 
> > gtk.Entry. This is Ok.
> > 
> > Because a search-job can take quite a long time, I do not want to 
> > activate search for each keystroke, when user types text in the search 
> > field.  And this is my problem. Key-strokes activate the "changed" event 
> > on the gtk.ComboBoxEntry field. I cannot distinguish between the 
> > drop-down list's "changed" event (which I want) and the "changed" event 
> > when user types text (I try to avoid this event).
> > 
> > User is welcome to type in some text/query and press the [Start search] 
> > button. This is OK.
> > 
> > So how to avoid "changed" event on each keystroke?
> > 
> > A simplified but complete example: http://www.futuredesktop.com/tmp/w4.py
> > 
> > Happy Easter,
> >   Moma Antero
> >   Grønland
> > 
> > 
> > 
> 
> I couldn't find a direct way of handling the problem..
> 
> But how about a timeout that only occurs after the user stops typing 
> for a while (e.g. 1/2 a second).  It stops the search being triggered 
> for every keystroke.
> 
> 
> 
> 
> Python script attachment (w4.py)
> # -*- coding: utf-8 -*-
> import sys
> import gtk
> import gobject
> 
> class TestWindow(gtk.Window):
>     __gtype_name__ = "TestWindow"
> 
>     def __init__(self, *args):
>         gtk.Window.__init__(self, *args)
>         self.timeout = None
> 
>         self.set_default_size(300, 200)
> 
>         vbox = gtk.VBox()
>         self.add(vbox)
> 
>         hbox = gtk.HBox()
>         vbox.pack_start(hbox, expand=False, fill=False, padding=0)
> 
>         combo = gtk.combo_box_entry_new_text()
>         #combo.connect("key-press-event", self.combo_key_press_event)
>         #combo.connect("key-release-event", self.combo_key_press_event)
>         #combo.connect("changed", self.combo_selection_changed)
>         combo.connect("changed", self.combo_timeout)
>         hbox.pack_start(combo, expand=False, fill=False, padding=0)
> 
>         # Add some items
>         for i in range(6):
>             combo.append_text("Item %d" % (i,))
> 
>         # Text input field (gtk.Entry object)
>         entry = combo.get_children()[0]
>         # Activate called on Enter-key
>         entry.connect("activate", self.entry_activate_event, combo)
> 
>         button = gtk.Button("Start search")
>         button.connect("clicked", self.start_search_cb, combo)
>         hbox.pack_start(button, expand=False, fill=False, padding=0)
> 
>         self.show_all()
> 
>     def entry_activate_event(self, widget, user_data):
>         combo = user_data
>         txt = combo.get_active_text()
>         print "You pressed enter:", txt
>         return True
> 
>     def combo_timeout(self, widget):
>         if self.timeout :
>             gobject.source_remove(self.timeout)               # remove old 
> timeout
>         self.timeout = gobject.timeout_add(500, self.combo_selection_changed, 
> widget) # add a new one
> 
>     def combo_selection_changed(self, widget):
>         txt =  widget.get_active_text()
>         print "Selection changed:", txt
>         return False  # cancal the timeout
> 
>     def start_search_cb(self, widget, user_data):
>         combo = user_data
>         txt = combo.get_active_text()
>         print "Start search for:", txt 
> 
> 
> if __name__ == "__main__":
>     window = TestWindow()
>     window.show()
>     gtk.main()
> 
> _______________________________________________
> pygtk mailing list   pygtk@daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://faq.pygtk.org/

-- 
<--Linux... Because I'm Free-->
Marco Antonio Islas Cruz
"Markuz"
Linux User #280229
mar...@islascruz.org
mar...@unixmexico.org
mar...@linuxpozarica.com
marco.is...@gmail.com
islac...@yahoo.com
http://www.islascruz.org
http://wwww.christine-project.org
http://www.linuxpozarica.com

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to