Hi.

The latest pygtk2 has lost the 'area' field in expose events. Here's
the warning that now pops up when I run a drawing example program
I have ...

  File "win8.py", line 472, in expose_event
      area = event.area
      AttributeError: 'gtk.gdk.EventExpose' object has no attribute
      'area'

The code is the handler for an expose_event in a drawing area ...

def expose_event(widget, event):
    global pixmap
    area = event.area
    gc = widget.get_style().fg_gc[gtk.STATE_NORMAL]
    win = widget.window
    win.draw_drawable(gc, pixmap, area[0], area[1],
                      area[0], area[1], area[2], area[3])
    return gtk.FALSE

A CVS update today has pulled in the following changes which seem
like the likely cause ...

2002-06-03  Matt Wilson  <[EMAIL PROTECTED]>

        * gtk/gdk-types.defs (EventExpose): added to make the code
        generator write GdkEventExpose * for
        _wrap_gtk_container_propagate_expose (gets rid of a warning)

I tried adding the appropriate "fields" bits to the scheme code
in the hope that their addition would fix the problem, but the
resulting python module segfaulted immediately, so my efforts
were a failure. :-(

Below is a hacked-up version of the "scribble.py" script
found in the examples/simple directory that I made run under
pygtk2. It demonstrates the warning. Feel free to swap out
the existing scribble.py script which is more for the older
pygtk release with mine if you want.

=========================================
#!/usr/bin/env python

#this is a simple translation of the scribble example that comes with GTK+

import gtk

pixmap = None

def configure_event(widget, event):
        global pixmap
        win = widget.window
        width = win.get_geometry()[2]
        height = win.get_geometry()[3]
        pixmap = gtk.gdk.Pixmap(win, width, height, -1)
        pixmap.draw_rectangle(widget.get_style().white_gc, gtk.TRUE,
                              0, 0, width, height)
        return gtk.TRUE

def expose_event(widget, event):
        area = event.area
        gc = widget.get_style().fg_gc[gtk.STATE_NORMAL]
        win = widget.window
        win.draw_drawable(gc, pixmap, area[0], area[1], area[0],
                              area[1], area[2], area[3])
        return gtk.FALSE

def draw_brush(widget, x, y):
        rect = (x-5, y-5, 10, 10)
        pixmap.draw_rectangle(widget.get_style().black_gc, gtk.TRUE,
                              x-5, y-5, 10, 10)
        widget.queue_draw()

def button_press_event(widget, event):
        if event.button == 1 and pixmap != None:
                draw_brush(widget, event.x, event.y)
        return gtk.TRUE

def motion_notify_event(widget, event):
        if event.is_hint:
                x, y, state = event.window.get_pointer()
        else:
                x = event.x; y = event.y
                state = event.state
        if state & gtk.gdk.BUTTON1_MASK and pixmap != None:
                draw_brush(widget, x, y)
        return gtk.TRUE

def main():
        win = gtk.Window()
        win.set_title('Test Input')
        win.connect('destroy', lambda win: gtk.main_quit())
        win.set_border_width(5)

        vbox = gtk.VBox(spacing=3)
        win.add(vbox)
        vbox.show()

        drawing_area = gtk.DrawingArea()
        drawing_area.set_size_request(200, 200)
        vbox.pack_start(drawing_area)
        drawing_area.show()

        drawing_area.connect("expose_event", expose_event)
        drawing_area.connect("configure_event", configure_event)
        drawing_area.connect("motion_notify_event", motion_notify_event)
        drawing_area.connect("button_press_event", button_press_event)
        drawing_area.set_events(gtk.gdk.EXPOSURE_MASK |
                                gtk.gdk.LEAVE_NOTIFY_MASK |
                                gtk.gdk.BUTTON_PRESS_MASK |
                                gtk.gdk.POINTER_MOTION_MASK |
                                gtk.gdk.POINTER_MOTION_HINT_MASK)

        button = gtk.Button("Quit")
        vbox.pack_start(button, expand=gtk.FALSE, fill=gtk.FALSE)
        button.connect("clicked", lambda widget, win=win: win.destroy())
        button.show()
        win.show()
        gtk.main()

if __name__ == '__main__':
        main()
=====================================================

Thanks for all the work on PyGTK.

-- 
They that can give up essential liberty to obtain a little temporary
safety deserve neither liberty nor safety.
 -- Benjamin Franklin, Historical Review of Pennsylvania, 1759
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to