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'
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