web-dev-qa-db-fra.com

Prendre une capture d'écran en utilisant python

Le ci-dessous code fonctionne parfaitement lorsque je l'exécute en tant qu'application console

import gtk.gdk
import time

w = gtk.gdk.get_default_root_window()
sz = w.get_size()
print "The size of the window is %d x %d" % sz
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])

ts = time.time()
filename = "screenshot"
filename += str(ts)
filename += ".png"

if (pb != None):
    pb.save(filename,"png")
    print "Screenshot saved to "+filename
else:
    print "Unable to get the screenshot." 

Mais maintenant, quand je l'ai utilisé dans une application Ubuntu (en utilisant le fast and glade), il me donne des messages d'erreur

 WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-O1o56xxlHA: Connection refused
/usr/lib/python2.7/dist-packages/gobject/constants.py:24: Warning: g_boxed_type_register_static: assertion `g_type_from_name (name) == 0' failed
  import gobject._gobject
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:40: Warning: specified class size for type `PyGtkGenericCellRenderer' is smaller than the parent type's `GtkCellRenderer' class size
  from gtk import _gtk
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:40: Warning: g_type_get_qdata: assertion `node != NULL' failed
  from gtk import _gtk

Comment puis-je améliorer ce code pour qu'il fonctionne dans une application basée sur une interface graphique?

EDIT Ce que j'ai fait pour changer le code

from gi.repository import Gdk, GdkX11, Gtk

        w = Gdk.get_default_root_window()
        geo = w.get_geometry()
        pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB,False,8,geo[2],geo[3])
        pb = pb.gdk_pixbuf_get_from_window(w,0,0,geo[2],geo[3])       
        pixbuf = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,geo[2],geo[3])        
        pixbuf.save("xdfgxfdgdfxgfdx.png","png")
        print "The size of the window is %d x %d" % sz
        pix = GdkPixbuf.Pixbuf.gdk_pixbuf_get_from_window(root_window, 0, 0, 500, 500)
        pix = GdkPixbuf.gdk_pixbuf_get_from_window(window,0,0,500,500);


       ts = time.time()
       filename = "screenshot"
       filename += str(ts)
       filename += ".png"

       if (pix != None):
           pix.save(filename,"png")
           print "Screenshot saved to "+filename
       else:
           print "Unable to get the screenshot." 

Mais ça me donne toujours une erreur

(0, 0, 1366, 768)
<Pixbuf object at 0x2966410 (GdkPixbuf at 0x2e42d90)>
Traceback (most recent call last):
  File "/home/srs/projectob-team/projectob_team/SelectmemoDialog.py", line 63, in on_start_clicked
    pb = pb.gdk_pixbuf_get_from_window(w,0,0,geo[2],geo[3])       
AttributeError: 'Pixbuf' object has no attribute 'gdk_pixbuf_get_from_window'
3
Subodh Ghulaxe

La manière correcte de prendre une capture d'écran en utilisant PyGobject (la version de Gtk utilisée par Quickly) est la suivante:

from gi.repository import Gdk

window = Gdk.get_default_root_window()
x, y, width, height = window.get_geometry()

print("The size of the root window is {} x {}".format(width, height))

# get_from_drawable() was deprecated. See:
# https://developer.gnome.org/gtk3/stable/ch24s02.html#id-1.6.3.4.7
pb = Gdk.pixbuf_get_from_window(window, x, y, width, height)

if pb:
    pb.savev("screenshot.png", "png", (), ())
    print("Screenshot saved to screenshot.png.")
else:
    print("Unable to get the screenshot.")

La première version que vous avez publiée concerne l'ancienne version de PyGtk. Cela fonctionne donc sur console car il ne charge que PyGtk. Dans Quickly apps, PyGobject est chargé et vous ne pouvez pas charger les deux. Vous êtes bloqué à la recherche de get_from_drawable (), voir:

https://developer.gnome.org/gtk3/stable/ch24s02.html#id-1.6.3.4.7

6
Havok