2010-06-15 8 views
0

Le script suivant prendra une capture d'écran sur un bureau Gnome.Convertir un script GTK python en C

import gtk.gdk 

w = gtk.gdk.get_default_root_window() 
sz = w.get_size() 
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False, 8, sz[0], sz[1]) 
pb = pb.get_from_drawable(w, w.get_colormap(), 0, 0, 0, 0, sz[0], sz[1]) 
if (pb != None): 
    pb.save("screenshot.png", "png") 
    print "Screenshot saved to screenshot.png." 
else: 
    print "Unable to get the screenshot." 

Maintenant, j'ai essayé de convertir en C et l'utiliser dans l'une des applications que je vous écris, mais jusqu'à présent j'ai échoué. Y a-t-il quoi faire en C (sur Linux)?

Merci! Jess.

+1

Qu'avez-vous eu jusqu'à présent? – Ken

+0

Eh bien, j'ai d'abord essayer avec quelques ajouts à la GTK (voir http://maemo.org/api_refs/5.0/beta/hildon/hildon-Additions-to-GTK+.html et un exemple de capture d'écran dans http: // maemo .gitorious.org/hildon/hildon/blobs/hildon-2-2/exemples/hildon-gtk-window-take-screenshot-sync.c) mais cela a apporté un enfer de dépendances, alors j'ai essayé XGetImage (http: // tronche.com/gui/x/xlib/graphics/XGetImage.html) mais ce code a besoin des librairies Xorg pour compiler ... vous pouvez voir ici un exemple de cela: http://www.codase.com/ search/call? name = xgetimage et maintenant je suis bloqué – Jessica

+1

Traduisez-le littéralement, 'gtk.gdk.get_default_root_window' devient' gdk_get_default_root_window' etc! – u0b34a0f6ae

Répondre

3

J'ai testé cela et cela fonctionne, mais il pourrait y avoir un moyen plus simple de passer de GdkPixbuf à un png, ce n'était que le premier que j'ai trouvé. (Il n'y a pas gdk_pixbuf_save())

#include <unistd.h> 
#include <stdio.h> 
#include <gdk/gdk.h> 
#include <cairo.h> 

int main(int argc, char **argv) 
{ 
    gdk_init(&argc, &argv); 

    GdkWindow *w = gdk_get_default_root_window(); 

    gint width, height; 
    gdk_drawable_get_size(GDK_DRAWABLE(w), &width, &height); 

    GdkPixbuf *pb = gdk_pixbuf_get_from_drawable(NULL, 
         GDK_DRAWABLE(w), 
         NULL, 
         0,0,0,0,width,height); 

    if(pb != NULL) { 
     cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 
                  width, height); 
     cairo_t *cr = cairo_create(surf); 
     gdk_cairo_set_source_pixbuf(cr, pb, 0, 0); 
     cairo_paint(cr); 
     cairo_surface_write_to_png(surf, "screenshot.png"); 
     g_print("Screenshot saved to screenshot.png.\n"); 
    } else { 
     g_print("Unable to get the screenshot.\n"); 
    } 
    return 0; 
} 

vous aviez compilez comme ceci: (en supposant que vous l'enregistrer comme screenshot.c)

gcc -std=gnu99 `pkg-config --libs --cflags gdk-2.0` screenshot.c -o screenshot 

Edit: les trucs pour sauver le pixbuf pourrait aussi ressembler à: (note que je n'ai pas essayé ceci, mais c'est seulement une ligne ...) Merci à kaizer.se d'avoir signalé mon échec lors de la lecture de doc: P

gdk_pixbuf_save(pb, "screenshot.png", "png", NULL, NULL); 
+1

gdk_pixbuf_save: http://library.gnome.org/devel/gdk-pixbuf/unstable/gdk-pixbuf3-file-saving.html#gdk-pixbuf-save – u0b34a0f6ae

+0

ah, n'a pas vu que ... devrait utilisé le recherche dans devhelp ... ah bien – Spudd86

+0

fantastique, merci. Juste comme une question secondaire, gdk_get_default_root_window() me donnera le bureau, est-il possible d'obtenir la fenêtre actuelle? – Jessica

Questions connexes