2012-03-11 4 views
3

J'ai rencontré un problème que je soupçonne de faire des éléments de peinture/dessin au Caire. J'ai une fenêtre sans bordure dans pygtk, mais je dessine deux rectangles avec un rectangle noir cairo.a et un rectangle gris à l'intérieur. Lorsque la fenêtre est redimensionnée, il semble que certaines parties du rectangle intérieur ne sont pas dessinées/peintes. J'ai inclus 3 captures d'écran pour montrer ce problème.Repeindre les fenêtres du cairo?

enter image description here enter image description here enter image description here

Comme vous pouvez le voir dans la deuxième et la troisième image, quelques morceaux de la fenêtre n'obtiennent pas peint en gris. Une façon de résoudre ce problème est d'appeler la méthode present() de la fenêtre de pygtk ... mais cela rend mon programme extrêmement lent, car la hauteur de la fenêtre change à peu près à chaque frappe. Donc, je me demandais quelles sont les alternatives que je dois résoudre ce problème.

ci-dessous est le code cairo pertinent j'utilise

def expose(self, widget, e): 
    cr = widget.window.cairo_create() 

    # Draw the background 
    cr.set_operator(cairo.OPERATOR_SOURCE) 

    # Create black rectangle with 60% opacity (serves as border) 
    (width, height) = widget.get_size() 
    cr.set_source_rgba(0, 0, 0, 0.6) 
    cr.rectangle(0, 0, width, height) 
    cr.fill() 

    # Inside the black rectangle, put a lighter one (will hold widgets) 
    (width, height) = widget.get_size() 
    cr.set_source_rgb(205/255, 205/255, 193/255) 
    cr.rectangle(10, 10, width-20, height-20) 
    cr.fill() 

    return False 

def screen_changed(self, widget, old_screen = None): 
    screen = widget.get_screen() 
    colormap = screen.get_rgba_colormap() 
    widget.set_colormap(colormap) 

Répondre

2

C'est en gros un bug GTK +, je crois. Lorsqu'une fenêtre est redimensionnée, GTK + ne met pas toujours en attente la totalité de la fenêtre à repeindre. Pour contourner le problème, vous pouvez appeler window.queue_draw() à l'endroit où vous faites redimensionner la fenêtre.

+0

cela l'a fait. Merci. – sqram

1

Essayez d'utiliser ce qui suit juste après la création de votre widget caire:

cr.set_source_rgb(0,0,0) 
cr.paint() 

Cela vous assurer d'avoir toujours une toile propre.

+0

ah. concept intéressant auquel je n'ai pas pensé. il n'a cependant pas résolu le problème. – sqram