Héritage de wxObject et polymorphisme ??

[Résolu]
Signaler
Messages postés
185
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2016
-
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
-
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

Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
17
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
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
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