IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Forme d'une Window en fonction d'un drawable


Sujet :

GTK+ avec Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut Forme d'une Window en fonction d'un drawable
    Bonjour !

    Tout nouveau tout beau sur le fofo !

    J'ai un soucis !
    Je voudrai donner une forme a une gtk.Window en fonction de ce que je dessine dans un gtk.gdk.Pixmap.

    Mais quand je récupère une pixbuf du drawable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, self.width, self.height)
    pixbuf.get_from_drawable(pixmap, pixmap.get_colormap(), 0, 0, 0, 0, self.width, self.height)
    Je me retrouve avec un pixbuf dont l'alpha a été remplacé par du noir !

    J'ai beau chercher pas de solution :/ !

    Quel est le problème ?

    Merci.

  2. #2
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    La question que je pose n'est pas directemant lier au sujet du topic !

    Je vais expliciter donc...

    En faite, je voudrai dessiner sur une gtk.Window et ensuite donnez la une forme a ma fenêtre de façon a tout ce qui n'a pas été peint soit "enlevé" (shape_combine_mask).
    Je suis obliger d'utiliser un pixmap car il me faut un drawable transparent a la base (gtk.Window.wondow est gris) si je veut que ça donne une forme.
    Donc je dessine sur mon pixmap, je récupère un pixbuf et récupère le mask (gtk.Pixbuf.render_pixmap_and_mask) puis je donne la forme a ma fenêtre.
    Mais la forme ne change pas car mon pixbuf n'a pas de pixel transparent :/ ! (remplacer par du noir).

    Donc ya deux solution en faite:
    -trouver le moyen de garder l'alpha quand on créer le pixbuf depuis le pixmap
    -transformer pixmap 8 bits en 1 bits pour qu'il soit accepté comme mask (si je fait pas d'erreur, le mask récupéré avec gtk.Pixbuf.render_pixmap_and_mask est en 1 bits)

    Dans les deux cas je n'y arrive pas :/ !

    En espérant avoir été plus clair !

    PS: Merci a Guigui_ pour avoir déplacer le topic !

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    J'ai trouver un bout de code qui marche en dessinant sur un pixmap 1 bits et en l'utilisant comme mask:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mask = gtk.gdk.Pixmap(None, self.width, self.height, 1)
    		context = mask.cairo_create()
     
    		context.set_source_rgb(0,0,0)
    		context.set_operator(cairo.OPERATOR_DEST_OUT)
    		context.paint()
    		context.set_operator(cairo.OPERATOR_OVER)
     
    		context.set_source_rgb(0, 0, 0)
    		context.arc(100,100,50,0,4)
    		context.fill()
     
    		self.window.shape_combine_mask(mask, 0, 0)
    		self.window.show()
    Ce qui est marrant, c'est que j'ai déja essayer ça !
    Sauf que moi je dessinait pas un cercle mais un rectangle (genre rectangle(0, 0, 50, 50) ).
    Mais avec un rectangle et bein ça marche pas.
    Donc je sais pas a quel point pygtk est buguer . Où la il faut m'expliquer ...

    Ho! Désespoire !

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    Peux-tu nous montrer un code qui ne marche pas ?

    -

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Par défaut
    Essaye comme ça, normalement ça ne marche pas.
    Après, a la fin de expose, décomente le dessin de l'arc et met en commentaire celui du crectangle. Là ça marche.
    Tu peut essayer les deux, si tu met pas le dessin de l'arc en dernier ça ne marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #!/usr/bin/env python
     
    import gtk, gtk.gdk, cairo
     
     
    class ShapedWindow(gtk.Window):
    	def __init__(self, x, y, w, h):
    		gtk.Window.__init__(self)
    		gtk.gdk.Drawable.__init__(self)
    		self.set_decorated(False)
    		self.set_app_paintable(True)
    		self.set_keep_above(True)
    		self.stick()
    		self.set_property('skip-taskbar-hint', True)
    		self.set_property('skip-pager-hint', True)
    		self.set_property('accept-focus', False)
    		self.set_property('has-focus', False)
    		self.move(x, y)
    		self.resize(w, h)
     
    		self.connect("expose_event", self.expose)
     
    		self.show_all()
     
    	def expose(self, widget, event):
    		w,h = self.get_size()
    		context =self.window.cairo_create()
     
    		context.set_source_rgb(0, 1, 0)
    		context.rectangle(50, 50, 100, 100)
    		context.fill()
     
     
    		mask = gtk.gdk.Pixmap(None, w, h, 1)# pixmap 1 bits
    		context = mask.cairo_create()
     
    		# on vide la pixmap
    		context.set_source_rgb(0,0,0)
    		context.set_operator(cairo.OPERATOR_DEST_OUT)
    		context.paint()
    		context.set_operator(cairo.OPERATOR_OVER)
     
     
    		context.set_source_rgb(0, 0, 0)
    		context.rectangle(50, 50, 100, 100)
    		#~ context.arc(100, 100, 50, 0, 6.15)
    		context.fill()
     
    		self.shape_combine_mask(mask, 0, 0)
     
     
    win = ShapedWindow(100, 100, 200, 200)
    gtk.main()

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329

Discussions similaires

  1. Différence entre une VCL Form et une Windows Form
    Par Klemsy78 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 02/04/2008, 19h46
  2. Mise en forme d'une cellule en fonction de son contenu
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/01/2008, 10h42
  3. Reconnaissance de "forme" sur une fonction
    Par Nemerle dans le forum Traitement du signal
    Réponses: 13
    Dernier message: 20/10/2006, 11h23
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. [C#] [VS.NET] Réutiliser une Form d'une application windows?
    Par yannick_sch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/10/2004, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo