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

wxPython Discussion :

wx.frame avec forme personnalisée et sans bordure


Sujet :

wxPython

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut wx.frame avec forme personnalisée et sans bordure
    Bonjour, je souhaite avoir un frame sans bordure (c'est le premier point) et avec une forme personnalisée. Pour cela je veux utiliser un wx.frame avec un style FRAME_SHAPED et faire un SetShape d'une Region définie par un Bitmap (l'image utilisée est jointe, elle représente une ellipse blanche sur fond noir) tel qu'indiqué dans la doc:
    wxRegion(const wxBitmap& bmp, const wxColour& transColour, int tolerance = 0)

    Constructs a region using the non-transparent pixels of a bitmap.
    Mon problème est que j'ai un message d'erreur comme quoi le premier argument de Region doit etre un int:
    Traceback (most recent call last):
    File "C:\Documents and Settings\VEGA\Bureau\wxShapedWindow.py", line 13, in <module>
    r = wx.Region(bmp, wx.BLACK, 0)
    File "C:\Python25\lib\site-packages\wx-2.8-msw-ansi\wx\_gdi.py", line 1459, in __init__
    _gdi_.Region_swiginit(self,_gdi_.new_Region(*args, **kwargs))
    TypeError: in method 'new_Region', expected argument 1 of type 'int'
    voici le code exemple:
    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    try:
        import wx
    except ImportError:
        raise ImportError,"The wxPython module is required to run this program"
     
    if __name__ == "__main__":
        app = wx.App()
        frame = wx.Frame(None,-1,'my application', style=wx.FRAME_SHAPED)
        bmp = wx.Bitmap("im2.png", wx.BITMAP_TYPE_PNG)
        r = wx.Region(bmp, wx.BLACK, 0)
        frame.SetShape(r)
        frame.Show(True)
        app.MainLoop()
    Quelqu'un sait il comment faire?
    Merci.
    Images attachées Images attachées  

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 30
    Points
    30
    Par défaut
    salut,

    j'ai deja fait ca voici le code :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
     
    import wx
    import images
    import sys, traceback
    import time
     
    class PosFrame(wx.Frame):
        def __init__(self, x=0, y=0, tempo = 5):
            self.tempo = tempo
     
            wx.Frame.__init__(self, None, -1, "pos",
                              style = wx.FRAME_SHAPED | wx.SIMPLE_BORDER | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR, 
                              pos = (x,y))
     
            self.hasShaped = False
     
            #Charge l'image
            self.bmp = images.getVippiBitmap()
            self.SetClientSize((self.bmp.GetWidth(), self.bmp.GetHeight()))
            dc = wx.ClientDC(self)
            dc.DrawBitmap(self.bmp, 0, 0, True)
            self.SetWindowsShape()
     
            self.Bind(wx.EVT_PAINT, self.OnPaint)
            self.Bind(wx.EVT_WINDOW_CREATE, self.SetWindowsShape)
     
            #timer pour fermer la fenetre au bout du temps tempo
            self.timer = wx.Timer(self)
            self.Bind(wx.EVT_TIMER, self.TimeOut)
     
            #rend transparent
            self.SetTransparent(150)
     
            self.Show()
     
        #Fonction appeler lors du timeout du timer
        def TimeOut(self, evt):
            print "time out"
            self.Close()
     
        def SetWindowsShape(self, evt = None):
            r = wx.RegionFromBitmap(self.bmp)
            self.hasShaped = self.SetShape(r)
     
        def OnPaint(self, evt):
            dc = wx.PaintDC(self)
            dc.DrawBitmap(self.bmp, 0, 0, True)
            if self.tempo>0:
                self.timer.Start(self.tempo * 1000, True)
     
        #Fonction qui permet de deplacer la fenetre aux coordonées x, y
        def SetPos(self, x, y):
            self.Move( (x,y) )
     
    try:
        if __name__ == '__main__':
            app = wx.PySimpleApp()
            posFrame = PosFrame(x=200,y=200,tempo=3)
            app.MainLoop()
    except SystemExit:
        pass
    except:
        traceback.print_exc (file=open('error.txt', 'w'))
    avec images :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def getVippiData():
        return \
    '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01^\x00\x00\x01O\x08\x06\x00\
    --datas---
    K\xf7\x8d\x82g\xaa6ex\x9f\xdc3pS\xc5*\xd1\xe9V\xd7\xaa\x1b\xfd\x028\xc0\xaeS\
    5\x9dLZ\x00\x00\x00\x00IEND\xaeB`\x82' 
     
    def getVippiBitmap():
        return BitmapFromImage(getVippiImage())
     
    def getVippiImage():
        stream = cStringIO.StringIO(getVippiData())
        return ImageFromStream(stream)
    sachant que l images est un png

    voila reste plus qu'a gere la sourie pour faire deplacer la frame

    Jean-michel

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Merci pour la réponse, mais étant débutant, j'avoue que j'ai du mal à voir où je dois mettre le nom de mon image et ce que je dois prendre ou pas.

    Cependant, en fonction du code proposé, j'ai pu chercher des infos sur le net et j'ai modifié (juste un peu) le code que j'ai donné avant et ca marche :

    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    try:
        import wx
    except ImportError:
        raise ImportError,"The wxPython module is required to run this program"
     
    if __name__ == "__main__":
        app = wx.App()
        frame = wx.Frame(None,-1,'my application', style=wx.FRAME_SHAPED)
        bmp = wx.Bitmap("im.png", wx.BITMAP_TYPE_PNG)
        bmp.SetMaskColour("black")
        r = wx.RegionFromBitmap(bmp)
        frame.SetShape(r)
        frame.Show(True)
        app.MainLoop()
    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aucun SystemMenu avec une Form sans bordure. Comment faire ?
    Par arnofly dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/06/2009, 15h11
  2. Déplacement d'une Form sans bordure ?
    Par arnofly dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/06/2009, 01h11
  3. Resize d'une form sans bordure
    Par Papy214 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2008, 15h13
  4. Une Form sans bordure mais redimensionnable
    Par kanzarih dans le forum Débuter
    Réponses: 2
    Dernier message: 29/04/2008, 21h23
  5. Deplacement d'une Form sans bordures
    Par blondelle dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2007, 22h56

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