tutorial español python user-interface gtk pygtk

python - pygtk tutorial español



Diálogo de entrada simple, versátil y reutilizable(a veces denominado diálogo de entrada) en PyGTK (3)

No hay uno disponible en GTK +. Tienes dos opciones:

  • Cree un diálogo, empaquete la Entrada y cualquier otro contenido que necesite (probablemente la mejor manera en mi opinión)
  • Recupere el content_area del MessageDialog y anexe una entrada.

Algo como:

#!/usr/bin/env python import gtk messagedialog = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK, message_format="Hello") action_area = messagedialog.get_content_area() entry = gtk.Entry() action_area.pack_start(entry) messagedialog.show_all() messagedialog.run() messagedialog.destroy()

Aunque probablemente necesite más refinamiento para que la Entrada se muestre bien.

Estoy buscando un diálogo simple con un widget de entrada de texto pidiéndole al usuario alguna entrada. El diálogo debe ser fácil de ejecutar (como las variantes gtk.MessageDialog ) y flexible.

Por supuesto, hay algunos ejemplos, pero no son lo suficientemente flexibles o demasiado complicados de construir para mi gusto.

Odio reinventar la rueda ... o un diálogo.


Basado en un ejemplo que encontré (¡gracias Ardoris !), Se me ocurrió una subclase de diálogo ... ¡espero que ayude a alguien por ahí!

#!/usr/bin/env python import gtk class EntryDialog(gtk.MessageDialog): def __init__(self, *args, **kwargs): '''''' Creates a new EntryDialog. Takes all the arguments of the usual MessageDialog constructor plus one optional named argument "default_value" to specify the initial contents of the entry. '''''' if ''default_value'' in kwargs: default_value = kwargs[''default_value''] del kwargs[''default_value''] else: default_value = '''' super(EntryDialog, self).__init__(*args, **kwargs) entry = gtk.Entry() entry.set_text(str(default_value)) entry.connect("activate", lambda ent, dlg, resp: dlg.response(resp), self, gtk.RESPONSE_OK) self.vbox.pack_end(entry, True, True, 0) self.vbox.show_all() self.entry = entry def set_value(self, text): self.entry.set_text(text) def run(self): result = super(EntryDialog, self).run() if result == gtk.RESPONSE_OK: text = self.entry.get_text() else: text = None return text

El método run() devuelve el texto ingresado en el cuadro de entrada si el usuario presiona <Enter> o hace clic en Aceptar. Si se hace clic en Cancel o se presiona <Esc> , el método run() devuelve None .

Excepto por eso, el diálogo debe comportarse como cualquier otra instancia de gtk.MessageDialog .

Tal vez eso no sea muy general, ya que supone que siempre tendrá Ok como opción, pero eso es lo que necesito en el 99% de mis casos de uso de todos modos.


Aquí está la función que escribí, basada en las respuestas anteriores aquí. Es una función en lugar de una clase, lo que significa que puede usarla en una línea.

def get_text(parent, message, default=''''): """ Display a dialog with a text entry. Returns the text, or None if canceled. """ d = gtk.MessageDialog(parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, message) entry = gtk.Entry() entry.set_text(default) entry.show() d.vbox.pack_end(entry) entry.connect(''activate'', lambda _: d.response(gtk.RESPONSE_OK)) d.set_default_response(gtk.RESPONSE_OK) r = d.run() text = entry.get_text().decode(''utf8'') d.destroy() if r == gtk.RESPONSE_OK: return text else: return None