Hi again,

Thanks everyone for the last tips. Here's another problem. I try to
check on the canvas if there is already an item or not (the item can be
a simple rectangle). I try to use :

     item = self.canvas.get_item_at(event.x,event.y)
     if item != None:
         return TRUE

This brings a Segmentation Fault if there is nothing under
(event.x,event.y) ! Do you know why ?
(see the attached example which is a modified version of the
canvas-example.py by Jesper Skov)

Oh, by the way, how can I check wheter this is a rectangle or an ellipse
? Any item.type() or so ?

Best,
Sebastien


[EMAIL PROTECTED]
#!/usr/bin/env python

# Author: Jesper Skov <[EMAIL PROTECTED]>
# A rewite of the C canvas example in the GNOME Developer's Information

import GDK
from gtk import *
from gnome.ui import *
from whrandom import *
import GdkImlib

class CanvasExample:
    def __init__(self):
        self.generator = whrandom()

        self.width = 400
        self.height = 400

        self.all = []

        self.colors = ("red",
                       "yellow",
                       "green",
                       "cyan",
                       "blue",
                       "magenta")


    def change_item_color(self, item):
        # Pick a random color from the list.
        n = int(self.generator.random() * len(self.colors)) - 1
        item.set(fill_color = self.colors[n])

################  added part  ##############################
    def test_if_item(self,event):
        item = self.canvas.get_item_at(event.x,event.y)
        if item != None:
            return TRUE
############################################################

    def item_event(self, widget, event=None):
################  added part  ##############################
        if self.test_if_item(event):
############################################################
            if event.type == GDK.BUTTON_PRESS:
                if event.button == 1:
                    # Remember starting position.
                    self.remember_x = event.x
                    self.remember_y = event.y
                    return TRUE

                elif event.button == 3:
                    # Destroy the item.
                    widget.destroy()
                    return TRUE
                
            elif event.type == GDK._2BUTTON_PRESS:
                # Change the item's color.
                self.change_item_color(widget)
                return TRUE

            elif event.type == GDK.MOTION_NOTIFY:
                if event.state & GDK.BUTTON1_MASK:
                    # Get the new position and move by the difference
                    new_x = event.x
                    new_y = event.y
                    
                    widget.move(new_x - self.remember_x, new_y - self.remember_y)
                    
                    self.remember_x = new_x
                    self.remember_y = new_y
                    
                    return TRUE
                
            elif event.type == GDK.ENTER_NOTIFY:
                # Make the outline wide.
                widget.set(width_units=3)
                return TRUE

            elif event.type == GDK.LEAVE_NOTIFY:
                # Make the outline thin.
                widget.set(width_units=1)
                return TRUE
        
            return FALSE


    def add_object_clicked(self, widget, event=None):
        x1 = self.generator.random() * self.width
        y1 = self.generator.random() * self.height
        x2 = self.generator.random() * self.width
        y2 = self.generator.random() * self.height

        if x1 > x2:
            x2,x1 = x1,x2
        if y1 > y2:
            y2,y1 = y1,y2

        if (x2 - x1) < 10:
            x2 = x2 + 10

        if (y2 - y1) < 10:
            y2 = y2 + 10

        if (self.generator.random() > .5):
            type = 'rect'
        else:
            type = 'ellipse'

        w = self.canvas.root().add(type, x1=x1, y1=y1, x2=x2, y2=y2, 
                                   fill_color='white', outline_color='black',
                                   width_units=1.0)
        w.connect("event", self.item_event)

        self.all.append(w)

    def main(self):
        # Open window to hold canvas.
        win = GtkWindow()
        win.connect('destroy', mainquit)
        win.set_title('Canvas Example')

        # Create VBox to hold canvas and buttons.
        vbox = GtkVBox()
        win.add(vbox)
        vbox.show()

        # Some instructions for people using the example:
        label = GtkLabel("Drag - move object.\n" +
                         "Double click - change colour\n" +
                         "Right click - delete object")
        vbox.pack_start(label, expand=FALSE)
        label.show()

        # Create canvas.
        self.canvas = GnomeCanvas()
        self.canvas.set_usize(self.width, self.height)
        self.canvas.set_scroll_region(0,0, self.width, self.height)
        vbox.pack_start(self.canvas)
        self.canvas.show()

        # Create buttons.
        hbox = GtkHBox()
        vbox.pack_start(hbox, expand=FALSE)
        hbox.show()

        b = GtkButton("Add an object")
        b.connect("clicked", self.add_object_clicked)
        hbox.pack_start(b)
        b.show()

        b = GtkButton("Quit")
        b.connect("clicked", mainquit)
        hbox.pack_start(b)
        b.show()

        win.show()

if __name__ == '__main__':
    c = CanvasExample()
    c.main()
    mainloop()

Reply via email to