> I need help on how to use a drawingarea - how to draw colored
> lines/circles, how to clear the area, and so on.

> Is there sample code somewhere, or a geek who knows all this? :-)

Maybe here's a geek who knows these things... :)

OK, after you created a GtkDrawingArea, you should connect the
"expose-event" to it. This event occurs every time parts of the drawing
area have to be repainted.

The callback function for the event gets 2 parameters:
 1. the GtkDrawingArea object
 2. an event structure (which tells you useful things about the event)

To actually draw on the drawing area, you need a GdkGC object.
A GC is a graphics context and encapsulates settings for drawing.
You would, for example, change the drawing color in the GC.
You should also know that each window has its own GC (so if you have 2
drawing areas, you would usually need 2 GCs).

There is a difference between GtkWindows and GdkWindows. While the
GtkWindow is a GtkWidget, many widgets do have their own GdkWindows.
To get the GC of the drawing area, you call the "new_gc()" method of its
GdkWindow. Luckily, the event structure provides you with this GdkWindow
(it is also possible to get the GdkWindow of a _realized_ widget by calling
"get_window()" on that widget).

OK, now that you have the GC, you want to set a drawing color.
Using the colormap of the GdkDrawingArea, creating a GdkColor is as simple
as this:

  new_color = drawingarea.get_colormap().alloc(r, g, b)

where "r, g, b" are the RGB values of the color (ranging from 0 to 65535).

You could also use X-color-names:

  new_color = drawingarea.get_colormap().alloc("green")


Finally, we can draw on the drawing area:

  drawingarea.draw_line(gc, x1, y1, x2, y2)


Here's tiny working example of all this stuff:

----------------------------------------------------------

  from gtk import *

  def _on_expose(drawingarea, event):
      # get the GdkWindow
      window = event.window

      # get the GC
      gc = window.new_gc()

      # create a green color
      color = drawingarea.get_colormap().alloc(0x0000, 0xFFFF, 0x0000)

      # use this color for drawing
      gc.foreground = color

      # draw a line
      drawingarea.draw_line(gc, 0, 0, 200, 200)

  
  # the usual stuff
  win = GtkWindow()
  win.connect("destroy", mainquit)
  win.show()

  # create the drawing area
  drawingarea = GtkDrawingArea()
  drawingarea.connect("expose-event", _on_expose)
  drawingarea.show()
  win.add(drawingarea)

  # enter the mainloop
  mainloop()

-----------------------------------------------------------


This example always draws the complete line whenever a part has to be
redrawn. You could only redraw the parts which need to be redrawn by
looking at the "area" variable (a rectangle) of the event structure.

To clear the area, you draw a filled rectangle over it:
  drawingarea.draw_rectangle(gc, TRUE, 0, 0, window.width, window.height)

However, if you seriously want to make use of the drawing area, then
you should create an off-screen pixmap where to draw on. And the expose
handler just copies this pixmap into the drawing area.

If you need more description and examples, you may contact me. The
Gdk-API Reference is also useful for exploring the GC and drawing
primitives. Not everything is implemented in PyGTK, though :(


Bye, Martin Grimme --- http://www.pycage.de
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk

Reply via email to