Hi!

I'm not sure what's your problem but I had have one of your problems:

The create_pango_layout is not supposed to be called all the time..
For that, my class caches the layout:

class Message:
        def __init__(self, msg):
                """ We are expecting unicode message strings """
                self.msg = msg.encode('utf-8')
                # create a font description
                self.font_desc = pango.FontDescription('Serif 8')

        def _make_layout (self, widget):
                global wrapmode, wrapwidth
                # create a layout for your drawing area
                self.layout = widget.create_pango_layout(self.msg)
                self.layout.set_wrap(wrapmode)
                self.layout.set_width(wrapwidth)
                # tell the layout which font description to use
                self.layout.set_font_description(self.font_desc)

        def _make_cache(self, gc):
                """ This method doesn't seems to be fundamental, but..  """
                global depth
                #self.image = string.join(self.mx*3*self.my*['\0'],"")
                #self.image = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 
self.mx, self.my)
                self.image = gtk.gdk.Pixmap(None, self.mx, self.my, depth)

                self.gc = gc
                colormap = gc.get_colormap()
                white = colormap.alloc_color('white')
                yellow = colormap.alloc_color('yellow')
                black = colormap.alloc_color('black')

                gc.set_rgb_fg_color (yellow)
                self.image.draw_rectangle(gc, gtk.TRUE, 0,0, self.mx-1, self.my-1)
                gc.set_rgb_fg_color (black)
                self.image.draw_rectangle(gc, gtk.FALSE,0,0, self.mx-1, self.my-1)
                gc.set_rgb_fg_color (black)

                # draw the text with the draw_layout method
                self.image.draw_layout(self.gc, Message.BORDER_SIZE, 
Message.BORDER_SIZE, self.layout)

        def drawon(self, atx, aty, widget=None, gc=None):
                if not self.widget:
                        if not widget or not gc:
                                return
                        else:
                                self._make_layout(widget)
                                self.widget = widget
                                self._make_cache(gc)

                # draw the text with the draw_layout method
                #widget.window.draw_layout(gc, atx, aty, self.layout)
                #self.image.render_to_drawable (widget.window, gc, 0, 0, atx,aty, 
self.mx, self.my, gtk.gdk.RGB_DITHER_MAX, 0, 0)
                widget.window.draw_drawable(self.gc, self.image, 0, 0, atx, aty, 
self.mx, self.my)


This creates the layout and dumps it, with a frame into a pixmap that's
later used to be draw anytime.

I removed some code, but that should be enough.
It's from the class Message of IMFish(.sourceforge.net) :-)

Also, i think that you should setup what font do you want
to use, in other place, than the expose-cb!

Seeya!

-----Original Message-----
From: Jean-Baptiste Cazier <[EMAIL PROTECTED]>
To: "Gustavo J. A. M. Carneiro" <[EMAIL PROTECTED]>
Date: Fri, 12 Dec 2003 17:38:46 +0000
Subject: Re: [pygtk] High CPU problem example

>Hello Gustavo !
>
>Thanks for your answer.
>Your solution works fine for my simplified problem. It also pin-point the source of 
>my troubles.
>But in order to solve my original problem I need a further tip:
>Indeed If I actually draw something based on the modified font by adding the line
>        area.window.draw_layout(self.gc, 10, 10, 
> self.area.create_pango_layout("TEXT"))
>Nothing is drawn at all if moved to the area_realize_cb routine.
>
>In my real area_expose_cb routine I draw many things with various fonts that are 
>set-up in other windows
>For example I call draw_axes_s which uses 2 types of fonts.
>
>    def draw_axes_s(self, xo, yo, xs, ys ):
>      """ Draw axis and write down the labels on the screen"""
>    
>      win=self.area.window
>      mini=self.Cld.mini
>      maxi=self.Cld.maxi
>      mindist=self.Cld.mindist
>      markers=self.Cld.markers
>      location=self.Cld.location
>      f_mrkX=markers[0][0]
>      l_mrkX=markers[0][len(markers[0])-1]
>      f_mrkY=markers[1][0]
>      l_mrkY=markers[1][len(markers[1])-1]
>      
> xsize=min(max(float(xs)/(maxi[0]-mini[0])*mindist[0]*.9,self.min_size),self.max_size)
>      
> ysize=min(max(float(ys)/(maxi[1]-mini[1])*mindist[1]*.9,self.min_size),self.max_size)
>#      Draw the lines
>      self.gc.foreground =self.area.get_colormap().alloc_color("black")
>      win.draw_line(self.gc, xo, yo, xo+xs, yo)
>      win.draw_line(self.gc, xo, yo, xo, yo-ys)
>      #Draw ticks
>      for m in markers[0]:
>        col=(location[0][m]-mini[0])/(maxi[0]-mini[0])
>        win.draw_line(self.gc, xsize/2+xo+col*(xs-xsize), 
> yo,xsize/2+xo+col*(xs-xsize),yo+3 )
>      for m in markers[1]:
>        col=(location[1][m]-mini[1])/(maxi[1]-mini[1])
>        win.draw_line(self.gc, xo,-ysize/2+yo-col*(ys-ysize), xo-3, 
> -ysize/2+yo-col*(ys-ysize) )
>      font_desc=pango.FontDescription(self.lab_font)                                  
>                  <------
>      self.area.modify_font(font_desc)                                                
>                          <------
>
>#       write the labels
>      win.draw_layout(self.gc, xo+xs/2, yo+self.Yoffset*3/4, self.lay(self.Xlabel))
>      win.draw_layout(self.gc, xo-60, yo-ys-30,self.lay(self.Ylabel))
>      font_desc=pango.FontDescription(self.mrk_font)                                  
>                  <-------
>      self.area.modify_font(font_desc)                                                
>                          <-------
>
>     ....
>
>
>Moving this call to a realize emission that does not draw any axis at all
>
>So am I using pango or realize/expose_event the wrong way ?
>Any help will be appreciated
>
>
>regards.
>
>Jean-Baptiste

_______________________________________________
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