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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #! /usr/bin/env python
#-*- coding: utf-8 -*-
import wx
import wx.animate as ani
import wx.lib.evtmgr as em
myEvent = wx.NewEventType() # nouveau type d event pour mon bouton
EVT_BUTTON_ANIM = wx.PyEventBinder(myEvent, 1) # Creation d un binder pour le type
class BoutonAnime(wx.Window):
u'''Ce bouton est composé d un widget wx.Window sur lequel on centre
un contrôle animation.
Il attend en paramètre le nom d un fichier image gif animé.
Pour donner l apparence d un vrai bouton, la taille du wx.Window est de 6 pixels
supplémentaire dans les deux sens par rapport à la taille du GIF.
On attribue la couleur blanche comme fond du bouton, et on attribue cette
même couleur au fond du GIF à l aide de la méthode SetUseWindowBackgroundColour().
On utilise des eventManager pour intercepter les actions de la souris sur
le gif de façon à donner un fond gris au wx.Window lors d un appui et de le remettre
en blanc lors du relachement, ou lorsque la souris a quitté le GIF avant relachement.
Ce sont ces actions qui donnent l illusion d un bouton qu on enfonce.
Enfin, on procède à l envoi d un évènement EVT_BOUTON_ANIM lors du relachement du bouton
pour que le click puisse être intercepté par le parent.'''
def __init__(self, parent, image):
wx.Window.__init__(self, parent, -1, style=wx.BORDER_SIMPLE)
self.SetBackgroundColour(wx.WHITE)
self.image = image
animation = ani.Animation(self.image)
self.ctrl = ani.AnimationCtrl(self, -1, animation)
self.ctrl.SetUseWindowBackgroundColour(True)
self.ctrl.Play()
self.Bind(wx.EVT_SIZE, self.OnSize)
em.eventManager.Register(self.OnDown, wx.EVT_LEFT_DOWN, self.ctrl)
em.eventManager.Register(self.OnUp, wx.EVT_LEFT_UP, self.ctrl)
em.eventManager.Register(self.OnLeave, wx.EVT_LEAVE_WINDOW, self.ctrl)
def OnSize(self, event):
w, h = self.ctrl.GetSizeTuple()
taille = wx.Size(w+6, h+6)
self.SetSize(taille)
self.ctrl.CentreOnParent()
def OnLeave(self, event):
self.SetBackgroundColour(wx.WHITE)
self.Refresh()
def OnDown(self, event):
self.SetBackgroundColour(wx.LIGHT_GREY)
self.Refresh()
def OnUp(self, event):
self.SetBackgroundColour(wx.WHITE)
self.Refresh()
evt = wx.PyCommandEvent(myEvent, self.GetId())
self.GetEventHandler().ProcessEvent(evt)
event.Skip()
if __name__=="__main__":
class Test(wx.Frame):
u'''Cette classe ne sert qu à tester le bouton. Il faut juste
mettre un chemin valide d image gif animée en paramètre du bouton.
chien.gif est une image valide sur ma propre machine.'''
def __init__(self):
wx.Frame.__init__(self, None, -1, title = u"test du bouton animé")
self.SetBackgroundColour(wx.WHITE)
sizer = wx.BoxSizer(wx.VERTICAL)
self.bouton = BoutonAnime(self, "chien.gif")
sizer.Add(self.bouton, 0, wx.ALL, 60)
self.SetSizer(sizer)
self.Fit()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(EVT_BUTTON_ANIM, self.OnClick, self.bouton)
def OnClose(self, event):
self.Destroy()
def OnClick(self, event):
print u"Le click sur un bouton animé fonctionne"
class MyApp(wx.App):
def OnInit(self):
f = Test()
f.Show(True)
self.SetTopWindow(f)
return True
app = MyApp()
app.MainLoop() |
Partager