Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
LINUX & OPEN SOURCE
5 juillet 2009

gtk+ avec c et python

Depuis une dizaine de jours, je participe à un projet de logiciel de transfert des photos en vidéo. J'utilisais dvd-slideshows, assez rustique avec son interface texte, mais malgré tout puissant, puisqu'il intégre le fameux effet "Ken Burns". Malheureusement, depuis que je suis passé à Xubuntu 9.04 il ne fonctionne plus. Alors j'ai décidé d'essayer Imagination. Un logiciel tout récent, puisqu'il n'a même pas un an, encore très incomplet, en particulier KenBurns et l'inclusion de textes (titre et sous-titres) ne sont pas disponible, mais il est particulièrement prometteur.  Alors j'ai décidé d'aider Giuseppe et Tadej au développement, en particulier à l'inclusion de textes fixes ou animés.

J'ai l'habitude de créer des interfaces graphiques avec python et gtk+, précisement à l'aide de la bibliothéque pygtk. J'ai toujours trouvé la tâche un peu pénible,mais jamais très compliqué. Avec imagination, je me suis retrouvé à utilisé gtk en c; et c'est une autre histoire.   Ce n'est pas que c'est beaucoup plus compliqué qu'avec Python, mais c'est bien plus lourd à coder!  Mais au lieu de vous écrire des lignes et des lignes, je vous poste un exemple très simple écrit en c et en python. Ils font exactement la même chose:

gtk avec c

#include <gtk/gtk.h>

static void cb_button_click(GtkButton *button, gpointer data)
{
  GtkWidget *label = GTK_WIDGET(data);

  g_assert(label != NULL);
  gtk_label_set_text(GTK_LABEL (label), "Bonjour!");
}

static gboolean cb_delete(GtkWidget *window, gpointer data)
{
  gtk_main_quit();
  return FALSE;
}

int main (int argc, char *argv[])
{
  GtkWidget* window, *button, *label, *vbox;

  gtk_init(&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  button = gtk_button_new_with_label (_("Cliquez moi!"));
  label = gtk_label_new ("Êtes-vous prêt?");
  vbox = gtk_vbox_new(FALSE, 0);

  gtk_container_add(GTK_CONTAINER (window), vbox);
  gtk_container_add(GTK_CONTAINER (vbox), label);
  gtk_container_add(GTK_CONTAINER (vbox), button);

  g_signal_connect(G_OBJECT (window), "delete-event", G_CALLBACK(cb_delete), NULL);

  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_button_click), label);

  gtk_widget_show_all(window);
  gtk_main()
}

Total: 22 lignes sans les accolades.

gtk avec Python

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

def clicked(button, label):
    label.set_text("Bonjour!")

window = gtk.Window ()
vbox = gtk.VBox ()
button = gtk.Button("Cliquez moi!")
label = gtk.Label ("Êtes-vous prêt?")

window.add(vbox)
vbox.add(label)
vbox.pack_start(button, False, False)

window.connect("delete-event", lambda a,b: gtk.main_quit())
button.connect("clicked", clicked, label)

window.show_all()
gtk.main()

Total: 16 lignes

Alors? Lequel est le plus facile à lire et le moins pénible à taper?

Dommage que python soit un language interprété et si lent, sinon je n'utiliserai que lui. C'est vraiment dommage! Est-ce qu'il est techniquement possible qu'un langage compilé ait tous les avantages d'un langage interprété (en particulier l'allocation dynamique des variables à la volée) ? À priori non?

le projet Imagination

Publicité
Publicité
Commentaires
LINUX & OPEN SOURCE
Publicité
Archives
Publicité