<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
Hello,<BR>I want to use drag and drop in a gtk.DrawingArea, but when I use it, it is very slow : I am refreshing each time the mouse moves so the image does not follow the mouse. I also tried something else that consist in only refreshing the part of the gtk.DrawingArea which need to be refresh : it is not slow, but the area flash once on the part I refresh (because I delete the part before displaying the image again at a new position).<BR>Here is an example of a code that I made which is very, very slow (it refresh ALL the area each time the mouse moves) :<BR># -*- coding:Utf-8 -*-<BR>import pygtk<BR>pygtk.require("2.0")<BR>import gtk<BR>import cairo<BR><BR>class espaceDessin(gtk.DrawingArea):<BR> def __init__(self):<BR>         super(espaceDessin, self).__init__()<BR>  <BR>         self.set_size_request(400, 400)<BR>         self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white"))<BR>         self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.BUTTON1_MOTION_MASK)<BR>         self.connect("button-press-event", self.boutonSourisEnfonce)<BR>         self.connect("motion-notify-event", self.sourisBouge)<BR>         self.connect("button-release-event", self.boutonSourisRelache)<BR>         self.connect("expose-event", self.expose)<BR>  <BR>         self.surface1 = cairo.ImageSurface.create_from_png("gtk.png")<BR>         self.surface2 = cairo.ImageSurface.create_from_png("tux.png")<BR>         self.surface3 = cairo.ImageSurface.create_from_png("babyTux.png")<BR>  <BR>         self.largeur1 = self.surface1.get_width()<BR>         self.hauteur1 = self.surface1.get_height()<BR>         self.largeur2 = self.surface2.get_width()<BR>         self.hauteur2 = self.surface2.get_height()<BR>         self.largeur3 = self.surface3.get_width()<BR>         self.hauteur3 = self.surface3.get_height()<BR>  <BR>         self.posX1 = 0<BR>         self.posY1 = 0<BR>         self.posX2 = 150<BR>         self.posY2 = 200<BR>         self.posX3 = 250<BR>         self.posY3 = 100<BR>  <BR>         self.imageSelectionne = ''<BR>  <BR>         self.posSourisX = -1<BR>         self.posSourisY = -1<BR> <BR> def boutonSourisEnfonce(self, widget, evenement):<BR>         if evenement.button == 1:<BR>                 if evenement.x &gt; self.posX1 and evenement.x &lt; self.posX1 + self.largeur1:<BR>                         if evenement.y &gt; self.posY1 and evenement.y &lt; self.posY1 + self.hauteur1:<BR>                                 self.imageSelectionne = 'GTK'<BR>                 elif evenement.x &gt; self.posX2 and evenement.x &lt; self.posX2 + self.largeur2:<BR>                         if evenement.y &gt; self.posY2 and evenement.y &lt; self.posY2 + self.hauteur2:<BR>                                 self.imageSelectionne = 'TUX'<BR>                 elif evenement.x &gt; self.posX3 and evenement.x &lt; self.posX3 + self.largeur3:<BR>                         if evenement.y &gt; self.posY3 and evenement.y &lt; self.posY3 + self.hauteur3:<BR>                                 self.imageSelectionne = 'BABYTUX'<BR>                 else:<BR>                         self.imageSelectionne = ''<BR>  <BR> def sourisBouge(self, widget, evenement):<BR>         if evenement.is_hint:<BR>                 self.posSourisX, self.posSourisY, state = event.window.get_pointer()<BR>         else:<BR>                 self.posSourisX = evenement.x<BR>                 self.posSourisY = evenement.y<BR>                 state = evenement.state<BR>         if state &amp; gtk.gdk.BUTTON1_MASK:<BR>                 contexte = self.window.cairo_create()<BR>                 contexte.set_source_rgb(255, 255, 255)<BR>                 contexte.paint()<BR>                 if self.imageSelectionne == 'GTK':<BR>                         contexte.set_source_surface(self.surface1, self.posX1, self.posY1)<BR>                         contexte.paint()<BR>                         self.posX1 = self.posSourisX - self.largeur1 / 2<BR>                         self.posY1 = self.posSourisY - self.hauteur1 / 2<BR>                 elif self.imageSelectionne == 'TUX':<BR>                         contexte.set_source_surface(self.surface2, self.posX2, self.posY2)<BR>                         contexte.paint()<BR>                         self.posX2 = self.posSourisX - self.largeur2 / 2<BR>                         self.posY2 = self.posSourisY - self.hauteur2 / 2<BR>                 elif self.imageSelectionne == 'BABYTUX':<BR>                         contexte.set_source_surface(self.surface3, self.posX3, self.posY3)<BR>                         contexte.paint()<BR>                         self.posX3 = self.posSourisX - self.largeur3 / 2<BR>                         self.posY3 = self.posSourisY - self.hauteur3 / 2<BR>                 self.expose(widget, None)<BR>  <BR> def boutonSourisRelache(self, widget, evenement):<BR>         self.expose(widget, None)<BR> <BR> def expose(self, widget, evenement):<BR>         contexte = widget.window.cairo_create()<BR>         contexte.set_source_rgb(255, 255, 255)<BR>         contexte.set_source_surface(self.surface1, self.posX1, self.posY1)<BR>         contexte.paint()<BR>         contexte.set_source_surface(self.surface2, self.posX2, self.posY2)<BR>         contexte.paint()<BR>         contexte.set_source_surface(self.surface3, self.posX3, self.posY3)<BR>         contexte.paint()<BR><BR>class PyGtkApp(gtk.Window):<BR> def __init__(self):<BR>         super(PyGtkApp, self).__init__()<BR>  <BR>         self.set_title("Drag and Drop dans DrawingArea")<BR>         self.set_default_size(640, 480)<BR>         self.set_position(gtk.WIN_POS_CENTER)<BR>  <BR>         zoneDessin = espaceDessin()<BR>         boiteH = gtk.HBox()<BR>         boiteV = gtk.VBox()<BR>         boiteH.pack_start(boiteV, False, False)<BR>         boiteV.pack_start(zoneDessin, False, False)<BR>         self.add(boiteH)<BR>  <BR>         self.connect("destroy", gtk.main_quit)<BR>  <BR>         self.show_all()<BR><BR>PyGtkApp()<BR>gtk.main()<BR><BR><BR>Thanks for your help.<BR><br /><hr />Naviguez plus vite avec Internet Explorer 8 <a href='http://go.microsoft.com/?linkid=9655263' target='_new'>Ici.</a></body>
</html>