[Python] pygoocanvas: riferimenti -create/resize/move- di rettangoli

Simone 3nomis a gmail.com
Ven 19 Set 2008 17:55:50 CEST


Salve,

 mi sono da poco immerso nel geometrico mondo di pygoocanvas
ponendomi, almeno per ora, l'ambizioso obiettivo di disegnare,
ridimensionare e spostare rettangoli :-p

Tentando di accumulare una base di conoscenze minime per partire ho
cercato di recuperare quanta più documentazione possibile, fermandomi
purtroppo alla "sola" guida di riferimento delle API
locale(ubuntu#8.04: /usr/share/gtk-doc/html/pygoocanvas/index.html)
che  non mi è parsa particolarmente esemplificativa per un
novellino...

Rubando idee agli esempi trovati in rete, sono arrivato a disegnare,
con qualche dubbio, il mio primo rettangolo.

* Uno dei miei dubbi

consultando la guida di riferimento delle API leggo:

rect = goocanvas.Rect(x=100, y=100, width=200, height=100,
				stroke_color="red", fill_color="blue",
				line_width=5.0)

Noto che manca ogni riferimento all'argomento "parent=....". Argomento
presente in ogni altro esempio da me trovato e che ho incluso nel
codice di esempio che accodo a questa mail. Le prove/riprove fatte, mi
hanno portato a pensare che "parent" sia un elemento *necessario* ma
non ho trovato riferimenti che mi chiariscano cosa sia e come si debba
correttamente usare.

* Il secondo scoglio che vorrei superare è quello di capire come
ridimensionare un rettangolo in fase di creazione. Il mio intento era
in sintesi di:

1) Creare un piccolo(1x1 pixel) rettangolo collegato a un evento
"on_mouse_press".
2) Modificare la dimensione del rettangolo creato sfruttando "on_motion_notify".
3) Terminare il disegno del rettangolo con "on_button_release".

* L'ultimo scoglio resterà poi quello di spostare il rettangolo creato
trascinandolo con il mouse.

Qualcuno sarebbe così gentile da suggerirmi qualche riferimento utile
o del codice?

Grazie in anticipo :-),
  Simone

ps.
Accodo il codice a cui sto lavorando:

---python-code-begin---

#!/usr/bin/python

import gtk
import goocanvas

def main_quit(*arg):
    gtk.main_quit()

class ProvaCanvas(object):
    """
    prova canvas
    """
    def __init__(self):
        # Dimensioni canvas
        self.canvas_width=400
        self.canvas_height=400

        self.movement = False

    def on_button_press(self, widget, event):
        """
        """
        self.movement = True
        print '<button_press> x=%s, y=%s\n' % (event.x, event.y)

        self.button_press_x=event.x
        self.button_press_y=event.y

    def on_button_release(self, widget, event):
        """
        """
        self.movement = False
        print 'button released'

        width = event.x-self.button_press_x
        height = event.y-self.button_press_y

        self.draw_rect(event, width, height)
        self.draw_text(event, text='prova')

    def on_motion_notify(self, widget, event):
        if self.movement:
            print event.x, event.y


    def draw_rect(self, event, width=5, height=5, fill='blue'):
        """
        Disegno rettangolo

        """
        x1 = self.button_press_x
        y1 = self.button_press_y
        x2 = event.x
        y2 = event.y

        if x2 > x1:
            width = x2-x1
            x=x1
        else:
            width = x1-x2
            x=x2
        if y2 > y1:
            y=y1
            height = y2-y1
        else:
            y=y2
            height = y1-y2

        print 'rect (\n'
        print '\t x1: %s \n\t y1: %s \n' % (x1, y1)
        print '\t x2: %s \n\t y2: %s' % (x2, y2)
        print '\n\t width: %s \n\t height: %s\n\t)' % (width, height)

        if (width > 0) and (height > 0):
            self.rect = goocanvas.Rect(x=x,
                                       y=y,
                                       width=width,
                                       height=height,
                                       fill_color=fill,
                                       parent=self.root)
        else:
            print "Dimensioni nulle, non disegno"

    def draw_text(self, event, text="no text", font="Arial 10", width=100):
        """
        add text
        """
        x1 = self.button_press_x
        y1 = self.button_press_y
        x2 = event.x
        y2 = event.y

        if x2 > x1:
            width = x2-x1
            x = x1
        else:
            width = x1-x2
            x = x2
        if y2 > y1:
            y = y1
        else:
            y = y2

        msg = goocanvas.Text(text=text, font=font, x=x, y=y, width=width)

        self.root.add_child(msg)

    def main(self):

        win = gtk.Window()
        win.connect('destroy', main_quit)
        win.set_title('Prova Canvas')

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

	label = gtk.Label("Prova canvas. disegna rettangoli")
	vbox.pack_start(label, expand=False)
	label.show()

        # Creo canvas
        self.canvas = goocanvas.Canvas()
        self.canvas.set_size_request(self.canvas_width,self.canvas_height)
        self.canvas.set_bounds(0, 0, self.canvas_width,self.canvas_height)

        vbox.pack_start(self.canvas)

        self.canvas_width=400
        self.canvas_height=400
        self.canvas.show()
        self.canvas.connect('button-press-event', self.on_button_press)
        self.canvas.connect('button-release-event', self.on_button_release)
        self.canvas.connect('motion-notify-event', self.on_motion_notify)
        self.root = self.canvas.get_root_item()


        hbox = gtk.HBox()
        vbox.pack_start(hbox, expand=False)
        hbox.show()

        b = gtk.Button("Esci")
        b.connect("clicked", main_quit)
        hbox.pack_start(b)
        b.show()

        #win.show()
        win.show_all()

if __name__ == '__main__':
    c = ProvaCanvas()
    c.main()
    gtk.main()

---python-code-end---


Maggiori informazioni sulla lista Python