<br>
Hello all,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
i'm still facing some problems in making a widget move. <br>
<br>
For Johan : <br>
<br>
i checked out :<br>
<pre><a href="http://cvs.gnome.org/viewcvs/gnome-python/pygtk/examples/gtk/widget.py?view=markup">http://cvs.gnome.org/viewcvs/gnome-python/pygtk/examples/gtk/widget.py?view=markup</a><br><br>and integrated the two programs (mine and the one above).
<br><br></pre>
<br>
The resultant code :<br>
<br>
import sys<br>
import gobject<br>
import pango<br>
import gtk<br>
from gtk import gdk<br>
<br>
<br>
if gtk.pygtk_version &lt; (2, 8):<br>
&nbsp;&nbsp;&nbsp; print &quot;PyGtk 2.8 or later required for this example&quot;<br>
&nbsp;&nbsp;&nbsp; raise SystemExit<br>
<br>
try:<br>
&nbsp;&nbsp;&nbsp; import cairo<br>
except ImportError:<br>
&nbsp;&nbsp;&nbsp; raise SystemExit(&quot;cairo required for this example&quot;)<br>
<br>
<br>
<br>
class PyGtkWidget(gtk.Widget):<br>
&nbsp;&nbsp;&nbsp; def __init__(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gtk.Widget.__init__(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #self._layout = self.create_pango_layout(text)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #self._layout.set_font_description(pango.FontDescription(&quot;Sans Serif 16&quot;))<br>
<br>
&nbsp;&nbsp;&nbsp; # GtkWidget<br>
<br>
&nbsp;&nbsp;&nbsp; def do_realize(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The do_realize method is responsible for creating GDK (windowing system)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # resources. In this example we will create a new gdk.Window which we<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # then draw on<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # First set an internal flag telling that we're realized<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.set_flags(self.flags() | gtk.REALIZED)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Create a new gdk.Window which we can draw on.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Also say that we want to receive exposure events by setting<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # the event_mask<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.window = gdk.Window(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.get_parent_window(),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width=self.allocation.width,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height=self.allocation.height,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window_type=gdk.WINDOW_CHILD,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wclass=gdk.INPUT_OUTPUT,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event_mask=self.get_events() | gdk.EXPOSURE_MASK)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Associate the gdk.Window with ourselves, Gtk+ needs a reference<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # between the widget and the gdk window<br>
&nbsp;&nbsp;&nbsp; self.window.set_user_data(self)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Attach the style to the gdk.Window, a style contains colors and<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # GC contextes used for drawing<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.style.attach(self.window)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The default color of the background should be what<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # the style (theme engine) tells us.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.style.set_background(self.window, gtk.STATE_NORMAL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.window.move_resize(*self.allocation)<br>
<br>
&nbsp;&nbsp;&nbsp; def do_unrealize(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The do_unrealized method is responsible for freeing the GDK resources<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # De-associate the window we created in do_realize with ourselves<br>
&nbsp;&nbsp;&nbsp; self.window.set_user_data(None)<br>
<br>
&nbsp;&nbsp;&nbsp; def do_size_request(self, requisition):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The do_size_request method Gtk+ is calling on a widget to ask<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # it the widget how large it wishes to be. It's not guaranteed<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # that gtk+ will actually give this size to the widget<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # In this case, we say that we want to be as big as the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # text is, plus a little border around it.<br>
&nbsp;&nbsp;&nbsp; width, height = self._layout.get_size()<br>
&nbsp;&nbsp;&nbsp; requisition.width = width // pango.SCALE + BORDER_WIDTH*4<br>
&nbsp;&nbsp;&nbsp; requisition.height = height // pango.SCALE + BORDER_WIDTH*4<br>
<br>
&nbsp;&nbsp;&nbsp; def do_size_allocate(self, allocation):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The do_size_allocate is called by when the actual size is known<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # and the widget is told how much space could actually be allocated<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Save the allocated space<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.allocation = allocation<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If we're realized, move and resize the window to the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # requested coordinates/positions<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.flags() &amp; gtk.REALIZED:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.window.move_resize(*allocation)<br>
<br>
&nbsp;&nbsp;&nbsp; def do_expose_event(self, widget, event):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The do_expose_event is called when the widget is asked to draw itself<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Remember that this will be called a lot of times, so it's usually<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # a good idea to write this code as optimized as it can be, don't<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Create any resources in here.<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # In this example, draw a rectangle in the foreground color<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context = widget.window.cairo_create()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # set a clip region for the expose event<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context.rectangle(event.area.x, <br>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
event.area.y, <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.area.width, <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.area.height)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context.clip()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #self.draw(self.context)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return False<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #def draw(self, context):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rect = self.get_allocation()<br>
<br>
&nbsp;&nbsp;&nbsp; x = rect.width / 2 <br>
&nbsp;&nbsp;&nbsp; print 'X cordinate is : ' <br>
&nbsp;&nbsp;&nbsp; print x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = rect.height / 2<br>
&nbsp;&nbsp;&nbsp; print 'Y cordinate is : ' <br>
&nbsp;&nbsp;&nbsp; print y<br>
<br>
&nbsp;&nbsp;&nbsp; # Ellipse co-ordinates, default : centroid of Rectangle<br>
&nbsp;&nbsp;&nbsp; ex = x<br>
&nbsp;&nbsp;&nbsp; ey = y<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; ew = rect.width / 4.0<br>
&nbsp;&nbsp;&nbsp; eh = rect.height / 12.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.save()<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.translate (ex, ey)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; # edited by vihan<br>
&nbsp;&nbsp;&nbsp; context.scale (ew / 2.0 , eh / 2.0)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #context.arc (0, 0, 1., 0., 2 * math.pi)<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; # edited by vihan<br>
&nbsp;&nbsp;&nbsp; #<br>
&nbsp;&nbsp;&nbsp; # context.arc(x displacement, y displacement, 'another ellipse',&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'slice ellipse', start point, end point&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; # <br>
&nbsp;&nbsp;&nbsp; context.arc (0, 0, 1., 0, 2 * math.pi)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.fill_preserve()<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # This sets the colour of the Ellipse via R, G, B levels 0.0 - 1.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.set_source_rgb(0, 0, 1)<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke()<br>
&nbsp;&nbsp;&nbsp; context.restore ()<br>
<br>
gobject.type_register(PyGtkWidget)<br>
<br>
def main(args):<br>
&nbsp;&nbsp;&nbsp; win = gtk.Window()<br>
&nbsp;&nbsp;&nbsp; win.set_border_width(5)<br>
&nbsp;&nbsp;&nbsp; win.set_title('Widget test')<br>
&nbsp;&nbsp;&nbsp; win.connect('delete-event', gtk.main_quit)<br>
<br>
&nbsp;&nbsp;&nbsp; frame = gtk.Frame(&quot;Example frame&quot;)<br>
&nbsp;&nbsp;&nbsp; win.add(frame)<br>
<br>
&nbsp;&nbsp;&nbsp; w = PyGtkWidget(TEXT)<br>
&nbsp;&nbsp;&nbsp; frame.add(w)<br>
<br>
&nbsp;&nbsp;&nbsp; win.show_all()<br>
<br>
&nbsp;&nbsp;&nbsp; gtk.main()<br>
<br>
<br>
def main(args):<br>
&nbsp;&nbsp;&nbsp; win = gtk.Window()<br>
&nbsp;&nbsp;&nbsp; win.set_border_width(5)<br>
&nbsp;&nbsp;&nbsp; win.set_title('Widget test')<br>
&nbsp;&nbsp;&nbsp; win.connect('delete-event', gtk.main_quit)<br>
<br>
&nbsp;&nbsp;&nbsp; frame = gtk.Frame(&quot;Example frame&quot;)<br>
&nbsp;&nbsp;&nbsp; win.add(frame)<br>
<br>
&nbsp;&nbsp;&nbsp; w = PyGtkWidget()<br>
&nbsp;&nbsp;&nbsp; frame.add(w)<br>
<br>
&nbsp;&nbsp;&nbsp; win.show_all()<br>
<br>
&nbsp;&nbsp;&nbsp; gtk.main()<br>
<br>
if __name__ == '__main__':<br>
&nbsp;&nbsp;&nbsp; sys.exit(main(sys.argv))<br>
<br>
<br>
<br>
<br>
<br>
But i get the follwing error :<br>
<br>
<br>
Traceback (most recent call last):<br>
&nbsp; File &quot;ellipse-move.py&quot;, line 73, in do_size_request<br>
&nbsp;&nbsp;&nbsp; width, height = self._layout.get_size()<br>
AttributeError: 'PyGtkWidget' object has no attribute '_layout'<br>
TypeError: do_expose_event() takes exactly 3 arguments (2 given)<br>
<br>
<br>
i never faced this in the ellipse prototypes. There's another question
around the same, why is it that one can only add one widget object onto
a gtk drawing area ? i tried the following :<br>
<br>
import gtk<br>
import math<br>
<br>
class Ellipse(gtk.DrawingArea):<br>
&nbsp;&nbsp;&nbsp; def __init__(self):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gtk.DrawingArea.__init__(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.connect(&quot;expose_event&quot;, self.expose)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def expose(self, widget, event):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context = widget.window.cairo_create()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # set a clip region for the expose event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context.rectangle(event.area.x, event.area.y,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
event.area.width, event.area.height)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.context.clip()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.draw(self.context)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return False<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def draw(self, context):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rect = self.get_allocation()<br>
<br>
&nbsp;&nbsp;&nbsp; x = rect.width / 2 <br>
&nbsp;&nbsp;&nbsp; print 'X cordinate is : ' <br>
&nbsp;&nbsp;&nbsp; print x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = rect.height / 2<br>
&nbsp;&nbsp;&nbsp; print 'Y cordinate is : ' <br>
&nbsp;&nbsp;&nbsp; print y<br>
<br>
&nbsp;&nbsp;&nbsp; # Ellipse co-ordinates, default : centroid of Rectangle<br>
&nbsp;&nbsp;&nbsp; ex = x<br>
&nbsp;&nbsp;&nbsp; ey = y<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; ew = rect.width / 4.0<br>
&nbsp;&nbsp;&nbsp; eh = rect.height / 12.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.save()<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.translate (ex, ey)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; # edited by vihan<br>
&nbsp;&nbsp;&nbsp; context.scale (ew / 2.0 , eh / 2.0)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #context.arc (0, 0, 1., 0., 2 * math.pi)<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; # edited by vihan<br>
&nbsp;&nbsp;&nbsp; #<br>
&nbsp;&nbsp;&nbsp; # context.arc(x displacement, y displacement, 'another ellipse',&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'slice ellipse', start point, end point&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; # <br>
&nbsp;&nbsp;&nbsp; context.arc (0, 0, 1., 0, 2 * math.pi)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; context.fill_preserve()<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # This sets the colour of the Ellipse via R, G, B levels 0.0 - 1.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.set_source_rgb(0, 0, 1)<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.stroke()<br>
&nbsp;&nbsp;&nbsp; context.restore ()<br>
<br>
#### End of class Ellipse ####<br>
<br>
<br>
<br>
<br>
class myclass(gtk.DrawingArea):<br>
&nbsp;&nbsp;&nbsp; #def __init__(self):<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; gtk.DrawingArea.__init__(self)<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.add_events(gtk.gdk.BUTTON_PRESS_MASK |<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gtk.gdk.BUTTON1_MOTION_MASK)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.connect(&quot;expose_event&quot;, self.expose)<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.connect(&quot;button_press_event&quot;, self.pressing)<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.connect(&quot;motion_notify_event&quot;, self.moving)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
<br>
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; self.desp = 0<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def pressing(self, widget, event):<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.pressing_x = event.x<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def moving(self, widget, event):<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (self.pressing_x - event.x) &gt; 1:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.desp = self.desp + 0.1<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.desp = self.desp - 0.1<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.pressing_x = event.x<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.draw(self.context)<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.queue_draw()<br>
<br>
&nbsp;&nbsp;&nbsp; def expose(self, widget, event):<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.context = widget.window.cairo_create()<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.context.rectangle(event.area.x, event.area.y,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; event.area.width, event.area.height)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.context.clip()<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.draw(self.context)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return False<br>
<br>
&nbsp;&nbsp;&nbsp; def draw(self, context):<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; x = 100 / 2 <br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = 50 / 2<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context.rectangle (x + self.desp, y + self.desp, 100, 50)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.set_source_rgb(1, 1, 1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context.fill_preserve()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context.set_source_rgb(0, 0, 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context.stroke()<br>
<br>
<br>
def main():<br>
&nbsp;&nbsp;&nbsp; window = gtk.Window()<br>
&nbsp;&nbsp;&nbsp; eobj = Ellipse()<br>
&nbsp;&nbsp;&nbsp; eobj2 = Ellipse<br>
&nbsp;&nbsp;&nbsp; robj = myclass()<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; window.add(eobj)<br>
&nbsp;&nbsp;&nbsp; window.add(robj)<br>
&nbsp;&nbsp;&nbsp; #window.add(eobj2)<br>
&nbsp;&nbsp;&nbsp; window.connect(&quot;destroy&quot;, gtk.main_quit)<br>
&nbsp;&nbsp;&nbsp; window.show_all()<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; gtk.main()<br>
&nbsp;&nbsp;&nbsp; <br>
if __name__ == &quot;__main__&quot;:<br>
&nbsp;&nbsp;&nbsp; main()<br>
<br>
<br>
<br>
This creates a 2 ellipse objects and adds them to the window. However you can only display one at a time.<br>
<br>
<br>
<br>
On uncommenting the&nbsp;&nbsp;&nbsp;&nbsp; window.add(eobj2)&nbsp; line you get the error ;<br>
<br>
multiwidget.py:133: GtkWarning: Attempting to add a widget with type
GtkDrawingArea to a GtkWindow, but as a GtkBin subclass a GtkWindow can
only contain one widget at a time; it already contains a widget of type
GtkDrawingArea<br>
&nbsp; window.add(robj)<br>
Traceback (most recent call last):<br>
&nbsp; File &quot;multiwidget.py&quot;, line 141, in ?<br>
&nbsp;&nbsp;&nbsp; main()<br>
&nbsp; File &quot;multiwidget.py&quot;, line 134, in main<br>
&nbsp;&nbsp;&nbsp; window.add(eobj2)<br>
TypeError: GtkContainer.add() argument 1 must be gtk.Widget, not gobject.GObjectMeta<br>
<br>
<br>
Does anyone why is this so. Moreover how do i add more than one widget onto the window.<br>
<br>
Sorry for me repeatedly bothering every one with my &quot;Ellipse obsession&quot; but i just can't seem to get it right.<br>
<br>
Thanks,<br>
<br>
- vihan<br>