Manejo de ComboBoxEntry (pygtk)

Jesus Rodriguez foxandxss en gmail.com
Lun Dic 11 10:55:41 CET 2006


Gracias Arnau, tan buenas respuestas como siempre.

Habia leido ese apartado del manual, pero se me olvidó especificarle al
comboboxentry el model.

Ahora sí que me agrega cosas. Voy a seguir probandolo hasta poder hacerlo
funcionar bien.

Gracias de nuevo.

El día 11/12/06, Arnau Sanchez <arnau en ehas.org> escribió:
>
> Hola Jesús,
>
> > He creado un evento que cuando se pulse la tecla intro (conectando el
> > key-press-event del entry del CBE) pues se agregue en la lista.
> >
> > Pero me da este error:
> >
> > comboentry.py:39: GtkWarning: gtk_combo_box_append_text: assertion
> > `GTK_IS_LIST_STORE (combo_box->priv->model)' failed
> >  self.cmbe.append_text(texto)
>
> El assert te está avisando de que no has especificado un modelo para el
> ComboBoxEntry. En otras palabras, que no sabe qué tipo de datos quieres
> mostrar (en este caso, quieres un campo único tipo cadena).
>
> > self.cmbe.append_text(texto)
>
> No deberías hacer eso, fíjate lo que dice la documentación:
>
>
> http://www.pygtk.org/pygtk2reference/class-gtkcombobox.html#method-gtkcombobox--append-text
>
> The append_text() method appends the string specified by text to the
> list of strings stored in the combo box gtk.ListStore. *Note that you
> can only use this method with combo boxes constructed with the
> gtk.combo_box_new_text() function.*
>
> Así, sólo cuando obtienes el combo directamente puedes llamar a las
> funciones *_text:
>
> combo = gtk.combo_box_entry_new_text()
> combo.append_text(cadena)
>
> Pero si, como en tu caso, ya tienes el objeto creado desde glade, le
> debes asignar el modelo a posteriori, y usar las funciones
> append/insert/remove sobre el modelo (ojo, los valores dentro de una
> lista), no sobre el combo:
>
> #obtienes el objeto combo de glade
> liststore = gtk.ListStore(str)
> combo.set_model(liststore)
> combo.set_text_column(0)
> combo.append([cadena])
>
> (Nota: algunas veces he probado a usar el append_text con combos de
> glade y *también* me ha funcionado. Pero como está explícitamente
> prohibido en la documentación oficial, mejor no arriesgarse)
>
> Más información:
>
> http://www.pygtk.org/pygtk2reference/class-gtkliststore.html
> http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq16.008.htp
>
> > def key(self, widget, event):
> >        if event.keyval == 65293:
> >            print "Has pulsado intro"
>
> Un apunte, sólo tendrías que explicitar valores constantes cuando sea
> estrictamente necesario (afecta a la legibilidad). Como los keyvals te
> los proporciona el propio gtk, es mejor que los uses:
>
>      if event.keyval == gtk.keysyms.Return
>
> La tabla está en el fichero "keysyms.py" del paquete pygtk. En las
> distros debian, por ejemplo, encontrarás las definiciones en este
> fichero: /usr/share/python-support/python-gtk2/gtk-2.0/gtk/keysyms.py
>
> Pero en este caso concreto no te recomendaría usar "key-press-event",
> los widgets "entry" ya tienen la señal "activate", que se emite
> precisamente al apretar enter:
>
>
> http://www.pygtk.org/pygtk2reference/class-gtkentry.html#signal-gtkentry--activate
>
> Por mi experiencia en pygtk, me he dado cuenta que es muy útil saber
> utilizar los widgets directamente; que luego en tu proyecto usas glade,
> perfecto, pero ya curtido con el uso de los widgets de primera mano.
> Además, eso te permite sacarle más provecho a la consola interactiva que
> incluye el tutorial, muy útil para hacer pruebas:
>
> http://www.pygtk.org/pygtk2tutorial/examples/pygtkconsole.py
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>




Más información sobre la lista de distribución Python-es