tutorial python gtk3

tutorial - Manera adecuada de construir aplicaciones Gtk3 en Python



python gtk 3 (3)

El segundo ejemplo de código parece innecesariamente complicado para mí, el primero parece perfectamente bien. El autor de ese segundo tutorial ha puesto un enlace a otro ejemplo aún más simple ( Source ):

from gi.repository import Gtk window = Gtk.Window(title="Hello World") window.connect("destroy", lambda w: Gtk.main_quit()) window.add(Gtk.Label("Hello World!")) window.show_all() Gtk.main()

No hay nada de malo en ninguno de los dos enfoques. Puede usar todos los widgets predeterminados, sin subclasificar nada, como en el ejemplo anterior. O puede crear una subclase de ciertos widgets, principalmente como una forma de darle a su código una estructura agradable y tener widgets personalizados / modificados reutilizables al final. Eso es todo depende de ti.

Lo mismo se aplica a Qt y muchos otros marcos de GUI, por cierto.

Acabo de comenzar a aprender sobre la creación de aplicaciones GUI en Python. Decidí usar Gtk versión 3. De acuerdo con el tutorial (¿oficial?) En http://python-gtk-3-tutorial.readthedocs.org/ la forma correcta de crear una aplicación de hello world es:

from gi.repository import Gtk class MyWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) self.set_default_size(200, 100) self.connect(''destroy'', Gtk.main_quit) self.show_all() MyWindow() Gtk.main()

En otro tutorial ( http://www.micahcarrick.com/gtk3-python-hello-world.html ) encontré un enfoque completamente diferente que es:

from gi.repository import Gtk, Gio class HelloWorldApp(Gtk.Application): def __init__(self): Gtk.Application.__init__(self, application_id="apps.test.helloworld", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.on_activate) def on_activate(self, data=None): window = Gtk.Window(type=Gtk.WindowType.TOPLEVEL) window.set_title("Gtk3 Python Example") window.set_border_width(24) label = Gtk.Label("Hello World!") window.add(label) window.show_all() self.add_window(window) if __name__ == "__main__": app = HelloWorldApp() app.run(None)

¿Podría alguien con experiencia en esta categoría decirme de qué manera debería escribir aplicaciones Gtk 3 en python en estos días? Ya estoy familiarizado con la escritura de GUI (pasé unos meses en el Swing de Java) para que pueda continuar con términos como eventos, devoluciones de llamadas, etc.


El segundo enfoque es mejor. Hace que la aplicación esté más integrada en el escritorio e informa más sobre lo que hace o debe hacer. También le proporciona más herramientas para usar con su aplicación.

Creo que el primer enfoque no está actualizado o algo así. El segundo es realmente el camino preferido.

Puede ver que la aplicación Gnome-music está utilizando el segundo enfoque con el uso de Gtk.Aplicación. Todas las aplicaciones oficiales de Gnome están utilizando Gtk.Application, y todas las aplicaciones de Gtk también deberían usarla.


La elección de escribir su nuevo programa con una aplicación Gtk o solo con una GtkWindow depende de la funcionalidad que necesite y, en cierta medida, de la audiencia prevista.

Para la mayoría de los casos, especialmente cuando todavía estás aprendiendo el conjunto de herramientas, tiendo a estar de acuerdo con valmynd en que GtkApplication es innecesariamente complicado. GtkApplication proporciona una gran cantidad de funciones adicionales que probablemente no desee o necesite en aplicaciones más pequeñas.

Para aplicaciones más grandes y más completas, estoy de acuerdo con Dragnucs, el segundo enfoque es superior y puede proporcionar una mejor integración en el entorno de escritorio. De la meta de GNOME: puerto a GtkApplication (vea también los documentos de GtkApplication ):

Portar su aplicación para usar GtkApplication tiene ventajas bastante buenas: GtkApplication maneja la inicialización de GTK +, la singularidad de la aplicación, la administración de sesión, proporciona algunas funciones básicas de script e integración de shell de escritorio mediante la exportación de acciones y menús, y administra una lista de ventanas de nivel superior cuyo ciclo de vida se vincula automáticamente El ciclo de vida de su aplicación.

Sin embargo, no estoy de acuerdo con Dragnucs acerca de por qué se introduce el enfoque de GtkWindow en el tutorial. Tiendo a pensar que los ejemplos sencillos con muy poca información son más apropiados para una sección de Primeros pasos de tutoriales (pero creo que el tutorial de lectura de documentos debe actualizarse para incluir al menos alguna mención de GtkApplication).

En las aplicaciones que he escrito, tiendo a subclasificar tanto a GtkApplication como a GtkWindow o para aplicaciones de ventana única rápidas y desagradables solo a la subclase GtkWindow. Su decisión dependerá de sus necesidades de aplicaciones.

Diferencia técnica: También hay una diferencia técnica importante entre cómo se implementan los dos ejemplos. El ejemplo con solo un GtkWindow crea un nuevo bucle principal de Gtk para cada instancia del programa. El ejemplo con GtkApplication crea un solo bucle principal adjunto a la primera instancia y cada llamada subsiguiente que se run(None) solicitará que la instancia original cree una nueva ventana (la nueva instancia se cerrará). Intente abrir dos terminales y ejecutar su aplicación en cada ventana, observe que un terminal esperará hasta que todas las ventanas se hayan cerrado antes de volver a ser sensibles. Puedes cambiar este comportamiento usando G_APPLICATION_NON_UNIQUE lugar de G_APPLICATION_FLAGS_NONE .