Hi,

I cannot understand why the program below, is not able to update the
draw when I push the button.

I.e. when the button is pushed the code in Plot::calc is executed.
At the end of this code I must emit a expose-event but the call
to self.queue_draw_area is not working at all..

help, please.

Thanks,
 A. Caruso
from numpy import *
import pysmm_graphlib as gl
import numpy.random
import framework
from math import pi

n = 50
x = numpy.random.random(n)
y = numpy.random.random(n)
(ll, hh, dist) = gl.PYSMMGL_Emst(x,y)
triangles = gl.PYSMMGL_Delaunay(x,y)


class Plot(framework.Screen):
    def calc(self):
        x = numpy.random.random(n)
        y = numpy.random.random(n)
        (ll, hh, dist) = gl.PYSMMGL_Emst(x,y)
        triangles = gl.PYSMMGL_Delaunay(x,y)
        (w,h) = self.window.get_size()
        self.queue_draw_area(0,0,w,h)

    def draw(self, cr, width, height):
		# draw the background
		cr.set_source_rgb(1,1,1)
		cr.rectangle(0,0,width,height)
		cr.fill()

		# draw points
		cr.set_source_rgb(0,0,0)
		for i in xrange(len(x)):
			cr.arc(x[i]*width,y[i]*height,2,0,2*pi)
			cr.fill()

		# draw the triangulation
		cr.set_source_rgb(0,0,0.5)
		cr.set_line_width(0.3)
		for t in triangles:
			cr.move_to(x[t[0]] *width,y[t[0]]*height)
			cr.line_to(x[t[1]] *width,y[t[1]]*height)
			cr.line_to(x[t[2]] *width,y[t[2]]*height)
			cr.line_to(x[t[0]] *width,y[t[0]]*height)
			cr.stroke()
		cr.set_source_rgb(1,0,0)
		cr.set_line_width(2)
		for i in xrange(len(ll)):
			cr.move_to(x[ll[i]]*width, y[ll[i]]*height)
			cr.line_to(x[hh[i]]*width, y[hh[i]]*height)
			cr.stroke()

framework.run(Plot)
		
#! /usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk, gobject, cairo

# Create a GTK+ widget on which we will draw using Cairo
class Screen(gtk.DrawingArea):
    # Draw in response to an expose-event
    __gsignals__ = { "expose-event": "override" }
    
    # Handle the expose-event by drawing
    def do_expose_event(self, event):
	
        # Create the cairo context
        cr = self.window.cairo_create()

        # Restrict Cairo to the exposed area; avoid extra work
        cr.rectangle(event.area.x, event.area.y,
                event.area.width, event.area.height)
        cr.clip()
        self.draw(cr, *self.window.get_size())

    def calc(self):
        print "Redefine this method in the Derived class"

    def draw(self, cr, width, height):
        # Fill the background with gray
        cr.set_source_rgb(0.5, 0.5, 0.5)
        cr.rectangle(0, 0, width, height)
        cr.fill()

# GTK mumbo-jumbo to show the widget in a window and quit when it's closed
def run(Widget):
    window = gtk.Window()
    window.connect("delete-event", gtk.main_quit)
    vbox = gtk.VBox(False,2)
    widget = Widget()
    widget.set_size_request(500,500)
    vbox.pack_start(widget,False,False,0)
    widget.show()
    button = gtk.Button("Recalc")
    vbox.pack_start(button,False,False,0)
    button.connect("clicked", (lambda s,w: w.calc()), widget)
    button.show()
    vbox.show()
    window.add(vbox)
    window.present()
    gtk.main()

if __name__ == "__main__":
    run(Screen)

_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to