Héritage de wxObject et polymorphisme ??

Résolu
RV2931 Messages postés 185 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 16 juillet 2016 - 19 févr. 2008 à 20:06
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 - 20 févr. 2008 à 10:54
Bonjour,

Je programme en wxPython et j'aurai voulu savoir comment dériver un objet wx pour faire un bouton personalisé par exemple, avec des informations supplémentaires, mais qu'ils soit quand même pris pour un bouton normal lorsque je lui applique des bindings car, lorsque l'on fait ça :

class MonBouton(wx.button):
    def __init__(self):
       wx.bouton(args)
       self.mySupInfo="InfoSupplémentaire"

et qu'en suite je fais un binding
MyBut=MonBouton()
MyBut.Bind(wx.EVT_BUTTON,MyFunc)

Il me dit quelque chose du genre
wxWindow expected (MonBouton) received

Le polymorphisme n'existe pas en python ?? ou bien n'est-il pas implémenté pour les objets wxPython ?? Y a-t-il moyen de forcer l'interprêteur à le prendre en tant que wx.Button (cast en C)???

Sinon, comment puis-je récupérer les bindings originaux de mon objet wx.button pour pouvoir gérer les évênements comme normalement avc ma propre classe.

J'ai pensé éventuellement à faire ça :

class MonBouton(wx.button):

    def __init__(self):

       self.orig=wx.bouton(args)

       self.mySupInfo="InfoSupplémentaire"
MyBut=MonBouton()

MyBut.orig.Bind(wx.EVT_BUTTON,MyFunc)

Cela fonctionne surement mais je ne trouve pas ça joli, super propre, un peu bidouille. Je viens du C++ et quand j'hérite d'une, j'hérite réellement d'une classe, et de tout ce qui va autour, comment puis-je faire ça en python ????

Merci

RV
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"            
                

2 réponses

aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
20 févr. 2008 à 10:54
Rien de bien compliqué :

import wx




class
Mon_Bouton(wx.Button):
    def __init__(self,panel,texte,info):
        wx.Button.__init__(self,panel,-1,texte)
        self.info = info



    defaffiche_info(self):
        return self.info






class
Frame(wx.Frame):
    def__init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,size=((200, 150)))



        panel = wx.Panel(self)



        text=wx.StaticText(panel, -1, "Bonjour tout le monde")      
        self.bouton = Mon_Bouton(panel, "Afficher les infos du bouton",\
                                            "Des infos suplémentaire")



        self.Bind(wx.EVT_BUTTON, self.info, self.bouton)
       
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text, 0, wx.ALL|wx.CENTER, 10)
        sizer.Add(self.bouton, 0, wx.ALL|wx.CENTER, 10)



        panel.SetSizer(sizer)
        panel.Layout()



        self.Centre()



    definfo(self, evt):
        print self.bouton.affiche_info()




class
MyApp(wx.App):
    defOnInit(self):
        frame = Frame(None, "Test")
        self.SetTopWindow(frame)



        frame.Show(True)
        return True
       
app = MyApp(True)
app.MainLoop()


Voila, il suffit de respecter la syntaxe des classes sous Python (rien à voir avec WxPython ton problème), quand tu dérive une classe, la première ligne de la fonction __init__ doit être Nom_Class_Dérivé.__init__(self,Arg) ! C'été juste ça !
______
Aéra
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
20 févr. 2008 à 10:31
Bonjour.
C'est surement car Bind n'est pas une méthode de wxButton (je ne connais pas beaucoup wxpython). Dans les exemples qu'il y a sur le net c'est la classe Frame qui utilise les binds :

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.pnl = wx.Panel(self)
self.label_1 = wx.StaticText(self.pnl, -1, " Fichier source")
self.button_1 = wx.Button(self.pnl, -1, "Parcourir")
self.text_ctrl_1 = wx.TextCtrl(self.pnl, -1, "")
self.label_2 = wx.StaticText(self.pnl, -1, " Garder une ligne sur")
self.label_5 = wx.StaticText(self.pnl, -1, "..................")
self.text_ctrl_2 = wx.TextCtrl(self.pnl, -1, "")
self.label_3 = wx.StaticText(self.pnl, -1, " Fichier destination")
self.button_2 = wx.ToggleButton(self.pnl, -1, "Auto")
self.text_ctrl_3 = wx.TextCtrl(self.pnl, -1, "")
self.label_4 = wx.StaticText(self.pnl, -1, " Etat")
self.button_3 = wx.Button(self.pnl, -1, "Go")
self.label_6 = wx.StaticText(self.pnl, -1, " Cutline 1.0")
 
self.__set_properties()
self.__do_layout()
 
self.Bind(wx.EVT_BUTTON, self.parcourir, self.button_1)
self.Bind(wx.EVT_TOGGLEBUTTON, self.auto, self.button_2)
self.Bind(wx.EVT_BUTTON, self.go, self.button_3)
 
 
self.compteur=0
# end wxGlade
0
Rejoignez-nous