Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 28/04/2006, à 14:09

g_barthe

interface python et apprentissage boa constrictor

Bonjour,
Je voudrais commencer à developper qq applications (avec interfaces graphiques) en python (pour windows et linux). Je recherche donc un éditeur qui permettrait de realiser l'interface de maniere simple et non en code pur. J'ai bien trouvé "wxglade" mais la lib wx n'a pas l'air d'etre présente de base avec python sur tous les environnements. (je peux me tromper) mais sous windows apparement je ne l'ai pas.
Il y a la librairie tk qui a l'air d'être prise en compte de manière générale mais la les éditeurs que j'ai trouvé"vtcl" n'arrive pas a se decompresser sous windows et comme je suis amené a developper sous ubuntu et windows je voudrais etre sur une librairie qui soit intégrée facilement à mon environnement de prog.
Y a t'il un avantage d'une librairie par rapport a l'autre ?
merci à vous et j'espère que j'ai été clair.

Dernière modification par g_barthe (Le 02/05/2006, à 18:18)


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#2 Le 28/04/2006, à 16:14

PierreR

Re : interface python et apprentissage boa constrictor

Pour TKinter, il y a peut être COBRA, mais je ne l'ai jamais utilisé.
Sinon, tu dois pouvoir utiliser GTK avec glade. GTK est le toolkit graphique utilisé par Gnome et il existe sous ubuntu et windows (mais pas mac OS). Il est plus complexe -- dans le sens offre plus de fonctionnalités -- que TKinter mais tout dépend de ce que tu veux faire -- GTK n'est pas installé par défaut sous windows par exemple (mais python non plus donc bon).

Hors ligne

#3 Le 28/04/2006, à 18:55

g_barthe

Re : interface python et apprentissage boa constrictor

bonjour
j'ai reussi a faire fonctionner qq scripts python sous ubuntu avec la lib wx. Mais j'ai installé vtcl depuis synaptic d'ubuntu en gros c'est glade pour me facilité la tâche de création de l'interface mais il exporte le code source uniquement en C et pas python. La vie d'un nouveau pythonien n'est pas facile tous les jours. Je crois que je vais rester à la création manuelle de l'interface et non pas graphique car je n'arrive pas a comprendre le fonctionnement de vtcl et je ne trouve pas de tuto sur le net.
Je cherche à faire une application un peu scientifique avec qq calculs pour mon boulot en génie climatique (calculs de clim, chauffage, ventilation). En gros ce sera des boutons de validation, zone de saisie...
Merci à vous


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#4 Le 28/04/2006, à 19:22

bipede

Re : interface python et apprentissage boa constrictor

Si tu veux tester un bon rad pour python et wxPython, essaies boa-constructor.

C'est le meilleur à l'heure actuelle. Et il est dans les dépôts...

Hors ligne

#5 Le 28/04/2006, à 22:09

aleph

Re : interface python et apprentissage boa constrictor

Je peux que recommander d'écrire son code dans un éditeur. Les avantages sont si nombreux.

Pour un bon début : http://wiki.wxpython.org/

#6 Le 29/04/2006, à 14:45

PierreR

Re : interface python et apprentissage boa constrictor

Oui, mais là on parlait de l'interface graphique et à écrire à la main c'est vraiment prise de tête quand le truc devient un peu gros.
Désolé de m'être trompé plus haut, je voulais effectivement parler de boa (et pas cobra). Sinon pour glade, il ne faut pas générer le code -- même en C c'est déconseillé et plus supporté depuis un moment -- mais utiliser libglade qui a je crois un wrapper python.

Hors ligne

#7 Le 29/04/2006, à 22:11

aleph

Re : interface python et apprentissage boa constrictor

@PierreR
Oui, mais là on parlait de l'interface graphique et à écrire à la main c'est vraiment prise de tête quand le truc devient un peu gros.
---

Pas du tout, c'est justement l'inverse qui se produit. Quelle est ton expérience? Sur quoi te bases-tu ? Argumentes !

Etant intimement lié à wxPython, je peux te dire que cette question a été posée des dizaines et des dizaines de fois sur la liste des wxPython users (et revient régulièrement). C'est toujours la même réponse qui revient. La même que celle que j'ai donné.

PS: ...mais là on parlait de l'interface graphique... wxPython ne s'occupe que de l'interface graphique.

#8 Le 30/04/2006, à 09:25

PierreR

Re : interface python et apprentissage boa constrictor

Heu, il y du y avoir un quiproquo, je voulais dire que quand on fait une interface graphique, à partir du moment ou le truc devient un peu gros (i.e. s'il y a plus d'un champ de texte et deux boutons) c'est très appréciable de disposer d'une interface graphique comme Glade.
Pour répondre à ta question, je dois avouer que je n'ai jamais utilisé wxwidgets (que ce soit en python ou en C++). Quand je faisais du python, je me contentais de Tkinter et c'est vrai que j'écrivais tout à la main et que je suis encore vivant.
Mais un des avantages que je vois aux éditeurs graphiques et de limiter à 0 u presque le risque de mélanger dans le code ce qui a trait à l'interface graphique et le reste rendant très facile un redesign complet de la dite interface même par quelqu'un qui n'aurai jamais touché une ligne de code. Je pensais au début que ce genre d'outils n'était qu'un "truc de feignant" promesse d'interfaces graphiques déguelasses. mais j'ai récemment participé à un projet qui utilise libglade (en C, je ne sais pas ce que ça donne en python mais ça doit être au moins aussi facile d'utilisation) et j'ai pu faire des changements très profond dans l'interface graphique en seulement quelques heures (et quelques centaines de clics et seulement une grosse dizaine de lignes de codes modifiées).

Hors ligne

#9 Le 30/04/2006, à 11:53

aleph

Re : interface python et apprentissage boa constrictor

PierreR

Bon si tu le dis.

Quand je remanie complètement une interface graphique contenant disons 10 - 50 contrôles, il me faut tout au plus 10 minutes et à peu près zéro clics de souris et le code application - partie calcul - n'est pas mélangé avec celui de l'interface graphique.

Ajouter deux paires - texte et texte d'entrée - à une fenêtre de dialogue qui en contient déjà 10, dois bien prendre 2 bonnes minutes.

Chacun sa méthode. Je dois dire que j'utilise des "sizers".

#10 Le 30/04/2006, à 20:31

PierreR

Re : interface python et apprentissage boa constrictor

Effectivement, les gouts et les couleurs !
Mais je suis d'accord que pour quelqu'un de soigneux -- contrairement à moi -- tout écrire à la main est tout aussi jouable et présente certains avantages. Personellement, j'apprécie particulièrement quand j'utilise glade de voir en direct le résultat, de pouvoir tester le redimensionnement, etc sans avoir à recompiler quoi que ce soit -- en C ou C++, effectivement, la question ne se pose pas avec Python -- et donc sans attendre.
Mais je reconnais effectivement que c'est plus un gout et un avis personnel que quelque chose d'indiscutable, dans le même genre, je n'ai jamais été un grand fan des traitements de texte wysywyg comme openoffice -- je préfère LaTeX ou des éditeurs de page web du même genre alors qu'en fait pour qulqu'un de soigneux ce sont sûrement des outils qui permettent d'arriver aux même résultat avec peut être moins d'effort.

Hors ligne

#11 Le 30/04/2006, à 20:55

aleph

Re : interface python et apprentissage boa constrictor

PierreR

Ta remarque concernant Python est très judicieuse. En effet, Python étant interprété, il me suffit d'un F5 (run script) dans mon éditeur pour voir le résultat.

J'apprécie aussi ta remarque à propos de LaTeX. Je suis du même avis, mais n'avait pas osé mettre le sujet sur la table (analogie).

Un point que j'affectionne particulièrement quand on travail à la main: la possibilité de créer aisément un classe dérivée d'un classe de base. C'est quelque chose que je fais très souvent et que je vois chez beaucoup de personnes avec qui j'échange du code. Par exemple: un contrôle d'entrée de texte qui n'accepte que les lettres minuscules ou un nombre.

Une petite question. Quand tu parles de "tester le redimensionnement". Cela signifierait-t-il que tu places les contrôles en définissant leurs positions en "pixels" ?

#12 Le 30/04/2006, à 21:08

aleph

Re : interface python et apprentissage boa constrictor

Honte de mon orthographe...

#13 Le 01/05/2006, à 17:16

PierreR

Re : interface python et apprentissage boa constrictor

On est quitte, je vois que j'ai fait une quantité de fautes de frappe proprement hallucinante.
Pour l'orienté objet, j'avoue qu'en C je n'ai pas encore vraiment pris l'habitude et en C++ je n'ai jamais fait de grosses interfaces graphiques mais j'entend bien l'argument. Notons toutefois qu'il y a toujours la possibilité de faire cela en laissant un "trou" avec l'interface graphique qu'on remplit ensuite à la main -- il y a même un "widget" special pour ça dans glade je crois.
Pour la dernière question, non je ne place jamais les widgets avec des positions absolues, je voulais dire vérifier que j'ai bien choisies les propriétés d'expansion des widgets de ma fenêtre et que c'est bien la vue arborescente et pas le bouton fermer qui occupe toute la place quand on l'agrandit par exemple -- mais ceci est peut être simplement du à mon inexpérience de GTK.

Hors ligne

#14 Le 01/05/2006, à 17:38

aleph

Re : interface python et apprentissage boa constrictor

PierreR

Merci.

#15 Le 02/05/2006, à 18:22

g_barthe

Re : interface python et apprentissage boa constrictor

Bonjour,
J'ai installé boa constrictor sur windows au bureau tout va bien et sur ma machine ubuntu breezy chez moi. Jusque la tout va bien. petit bémol sur Ubuntu ou les éléments de l'interface sont tronqués même en etendant les fenetres mais bon passons.
J'ai testé un exemple trouvé sur le net sous windows et ca fonctionne mais sous linux non. Alors la je me pose des questions sur la portabilité. Doit-on faire qqch de précis. Je joins le code :

fichier Frame1.py :

#Boa:Frame:Frame1

import wx

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1STATUSBAR1,
] = [wx.NewId() for _init_ctrls in range(2)]

[wxID_FRAME1MENUFILEITEMS0, wxID_FRAME1MENUFILEITEMS1,
wxID_FRAME1MENUFILEITEMS2, wxID_FRAME1MENUFILEITEMS3,
wxID_FRAME1MENUFILEITEMS4,
] = [wx.NewId() for _init_coll_menuFile_Items in range(5)]

[wxID_FRAME1MENUHELPABOUT] = [wx.NewId() for _init_coll_menuHelp_Items in range(1)]

class Frame1(wx.Frame):
    def _init_coll_menuBar1_Menus(self, parent):
        # generated method, don't edit

        parent.Append(menu=self.menuFile, title='File')
        parent.Append(menu=self.menuHelp, title='Help')

    def _init_coll_menuHelp_Items(self, parent):
        # generated method, don't edit

        parent.Append(help='Display general information about Notebook',
              id=wxID_FRAME1MENUHELPABOUT, kind=wx.ITEM_NORMAL, text='About')
        self.Bind(wx.EVT_MENU, self.OnMenuHelpAboutMenu,
              id=wxID_FRAME1MENUHELPABOUT)

    def _init_coll_menuFile_Items(self, parent):
        # generated method, don't edit

        parent.Append(help='', id=wxID_FRAME1MENUFILEITEMS0,
              kind=wx.ITEM_NORMAL, text='Open')
        parent.Append(help='', id=wxID_FRAME1MENUFILEITEMS1,
              kind=wx.ITEM_NORMAL, text='Save')
        parent.Append(help='', id=wxID_FRAME1MENUFILEITEMS2,
              kind=wx.ITEM_NORMAL, text='Save As')
        parent.Append(help='', id=wxID_FRAME1MENUFILEITEMS3,
              kind=wx.ITEM_NORMAL, text='Close')
        parent.Append(help='', id=wxID_FRAME1MENUFILEITEMS4,
              kind=wx.ITEM_NORMAL, text='Exit')
        self.Bind(wx.EVT_MENU, self.OnMenuFileItems0Menu,
              id=wxID_FRAME1MENUFILEITEMS0)
        self.Bind(wx.EVT_MENU, self.OnMenuFileItems1Menu,
              id=wxID_FRAME1MENUFILEITEMS1)
        self.Bind(wx.EVT_MENU, self.OnMenuFileItems2Menu,
              id=wxID_FRAME1MENUFILEITEMS2)
        self.Bind(wx.EVT_MENU, self.OnMenuFileItems3Menu,
              id=wxID_FRAME1MENUFILEITEMS3)
        self.Bind(wx.EVT_MENU, self.OnMenuFileItems4Menu,
              id=wxID_FRAME1MENUFILEITEMS4)

    def _init_coll_statusBar1_Fields(self, parent):
        # generated method, don't edit
        parent.SetFieldsCount(1)

        parent.SetStatusText(number=0, text='Status')

        parent.SetStatusWidths([-1])

    def _init_utils(self):
        # generated method, don't edit
        self.menuFile = wx.Menu(title='')

        self.menuHelp = wx.Menu(title='')

        self.menuBar1 = wx.MenuBar()

        self._init_coll_menuFile_Items(self.menuFile)
        self._init_coll_menuHelp_Items(self.menuHelp)
        self._init_coll_menuBar1_Menus(self.menuBar1)

    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(466, 359), size=wx.Size(400, 250),
              style=wx.DEFAULT_FRAME_STYLE, title='G\xe9nie climatique')
        self._init_utils()
        self.SetClientSize(wx.Size(392, 216))
        self.SetMenuBar(self.menuBar1)

        self.statusBar1 = wx.StatusBar(id=wxID_FRAME1STATUSBAR1,
              name='statusBar1', parent=self, style=0)
        self._init_coll_statusBar1_Fields(self.statusBar1)
        self.SetStatusBar(self.statusBar1)

    def __init__(self, parent):
        self._init_ctrls(parent)

    def OnMenuFileItems0Menu(self, event):
        event.Skip()

    def OnMenuFileItems1Menu(self, event):
        event.Skip()

    def OnMenuFileItems2Menu(self, event):
        event.Skip()

    def OnMenuFileItems3Menu(self, event):
        event.Skip()

    def OnMenuFileItems4Menu(self, event):
        event.Skip()

    def OnMenuHelpAboutMenu(self, event):
        event.Skip()


fichier App1.py :

#Boa:App:BoaApp

import wx

import Frame1

modules ={'Frame1': [1, 'Main frame of Application', 'Frame1.py']}

class BoaApp(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        self.main = Frame1.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True

def main():
    application = BoaApp(0)
    application.MainLoop()

if __name__ == '__main__':
    main()


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#16 Le 02/05/2006, à 18:43

bipede

Re : interface python et apprentissage boa constrictor

C'est un problème de codage de caractères :

si tu changes ta ligne :

              style=wx.DEFAULT_FRAME_STYLE, title='G\xe9nie climatique')

dans Frame1.py par :

              style=wx.DEFAULT_FRAME_STYLE, title='Génie climatique')

Et que tu ajoutes la ligne :

#-*- coding: utf8 -*-

En première ligne de tes deux scripts, ça va marcher...

Hors ligne

#17 Le 02/05/2006, à 22:30

aleph

Re : interface python et apprentissage boa constrictor

Boa ou les dix doigts ?

La même application écrite à la main. Pour moi, il n'y a pas photo quant à la clarté du code.
Sans compter les imperfections (erreur) dans le code généré par boa.

# -*- coding: iso-8859-1 -*-
#--------------------------------------------------------------------
# Name:      simple.py
# Purpose:   Small demo
# Author:    Jean-Michel Fauth, Switzerland
# Copyright: 
# Licence:   None, free software
#--------------------------------------------------------------------
# os dev:    w2k sp4
# py dev:    Python 2.4.2
# wx dev:    wxPython 2.6.3.2
# Revision:  2 May 2006
#--------------------------------------------------------------------

import wx

class MyPanel(wx.Panel):
    
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize)

class MyFrame(wx.Frame):
    
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (300, 200))
        self.CentreOnScreen()
        
        # menus
        menu1 = wx.Menu()
        menu101 = menu1.Append(101, '&Open...\tCtrl+o', 'Ouvre un fichier')
        menu103 = menu1.Append(102, '&Save as...\tCtrl+s', 'Enregistre un fichier sous')
        menu102 = menu1.Append(103, 'Save\tCtrl+s', 'Enregistre le fichier courant')
        menu104 = menu1.Append(104, '&Close')
        menu105 = menu1.Append(105, '&Exit', 'Quitte cette application')

        menu2 = wx.Menu()
        menu201 = menu2.Append(201, '&About...', 'A propos')

        menuBar = wx.MenuBar()
        menuBar.Append(menu1, '&File')
        menuBar.Append(menu2, '&Help')
        self.SetMenuBar(menuBar)

        # statusbar
        sb = wx.StatusBar(self, wx.NewId())
        self.SetStatusBar(sb)
        
        self.Bind(wx.EVT_MENU, self.OnMenu101, menu101)
        self.Bind(wx.EVT_MENU, self.OnMenu102, menu102)
        self.Bind(wx.EVT_MENU, self.OnMenu103, menu103)
        self.Bind(wx.EVT_MENU, self.OnMenu104, menu104)
        self.Bind(wx.EVT_MENU, self.OnMenu105, menu105)
        self.Bind(wx.EVT_MENU, self.OnMenu201, menu201)

        # panel contenant les widgets
        self.pa = MyPanel(self, wx.NewId())

        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

    def OnMenu101(self, event):
        print 'Menu101'

    def OnMenu102(self, event):
        print 'Menu102'

    def OnMenu103(self, event):
        print 'Menu103'

    def OnMenu104(self, event):
        print 'Menu104'

    def OnMenu105(self, event):
        print 'Menu105'
        self.OnCloseWindow(None)

    def OnMenu201(self, event):
        print 'Menu201'

    def OnCloseWindow(self, event):
        self.Destroy()

class MyApp(wx.App):

    def OnInit(self):
        frame = MyFrame(None, -1, 'Génie climatique')
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    app = MyApp(False)
    app.MainLoop()

if __name__ == '__main__':
    main()

#eof

#18 Le 02/05/2006, à 22:42

bipede

Re : interface python et apprentissage boa constrictor

aleph a écrit :

Boa ou les dix doigts ?

La même application écrite à la main. Pour moi, il n'y a pas photo quant à la clarté du code.
Sans compter les imperfections (erreur) dans le code généré par boa.

Tu prêches un convaincu smile

Mais notre ami veut utiliser un RAD.

Quant au code généré par Boa, il n'est pas si sale que cela, et je trouve que l'objet y est bien utilisé...

Hors ligne

#19 Le 03/05/2006, à 08:38

aleph

Re : interface python et apprentissage boa constrictor

bipede :
Quant au code généré par Boa, il n'est pas si sale que cela, et je trouve que l'objet y est bien utilisé...
---

Il est même très propre, c'est à dire bien conçu. Ce que je veux montrer ici est que l'utilisation d'un IDE n'est pas la panacée.
Le code généré par Boa doit faire deux choses:
- écrire le code de l'application.
- écrire le code de façon à ce que Boa puisque le récupérer et l'éditer à nouveau. D'où une certaine lourdeur. Une structure de code qui ne correspond pas à ce que l'application est censée faire, mais une structure qui est plus conforme à Boa.

Quelques autres commentaires en vrac :

- wx.InitAllImageHandlers() n'est par nécessaire, cette tâche est effectuée en interne par OnInit(), voir wxPython doc. Cette tâche est exécutée deux fois !
- event.Skip() dans les menus est inutile. Un "pass" eut été suffisant. A quoi bon surcharger, la queue des événements. Il faut bien que Boa mette quelque chose.
- Boa ne génère pas l'événement OnCloseWindow(), très important dans la pratique. Cette partie du code doit de toute façon est rajoutée à la main.
- Mon code avait des doc strings dans le function (triple double quoted strings). Il semblerait que ces doc strings se soient perdus en route !

Ma conclusion :
On en arrive à cette absurdité où seuls les personnes sachant développer à la main sont à même de comprendre correctement le code généré par Boa.

Ceci est vrai pour tous les IDEs.

Je ne peux que recommander une visite chez wxPython.org et télécharger la demo.

#20 Le 03/05/2006, à 08:48

aleph

Re : interface python et apprentissage boa constrictor

Petite remarque annexe:

L'IDE ne se nomme pas Boa constrictor, mais Boa constructor. En espérant que vous ayez compris la subtilité du nom.

#21 Le 03/05/2006, à 09:07

g_barthe

Re : interface python et apprentissage boa constrictor

Je vous remercie tous pour ces différentes remarques et je sais très bien que les IDE ne sont pas une solution très propre. Moi même pour du HTML je fais tout à la main, je gère mieux ce que je fais je trouve. Mais la n'y connaissant rien à python je voulais déjà créer un joli interface graphique de manière rapide sans trop avoir à comprendre la construction ce que je ferais pour le coeur du programme bien sur. Par la suite oui je redécortiquerais la partie interface pour la recoder de manière simple sans boa.


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#22 Le 03/05/2006, à 09:54

aleph

Re : interface python et apprentissage boa constrictor

Permets moi d'insister. Est-ce que tu as la demo de wxPython ?
Tous les widgets expliqués, le code pour chaque widget, modification et essai, tout ceci interactivement...sans jamais quitter l'application.

#23 Le 03/05/2006, à 11:08

g_barthe

Re : interface python et apprentissage boa constrictor

je viens de le télécharger et effectivement je connaissais pas et ca m'a l'air très instructif et très bien fait. Je vais me pencher ( pas top qd meme) bon c nul, sur cette doc  et continuer mon apprentissage et je vous tiendrais au courant de l'evolution.
Merci de votre aide.


Mon forum perso sur le génie climatique http://le-genie-climatique.positifforum.com/
Le forum des travaux manuels : http://pausebroderie.fr/

Hors ligne

#24 Le 03/05/2006, à 11:31

aleph

Re : interface python et apprentissage boa constrictor

Enfin ! Si j'ose dire. Comme cela fait bientôt 5 ans que je contribue assez fidèlement au projet wxPython, cela me fait plaisir. Je suis sous win, tu me pardonneras.
Bonne continuation.

#25 Le 03/05/2006, à 12:08

bipede

Re : interface python et apprentissage boa constrictor

aleph a écrit :

- wx.InitAllImageHandlers() n'est par nécessaire, cette tâche est effectuée en interne par OnInit(), voir wxPython doc. Cette tâche est exécutée deux fois !

Même si sur le reste je suis complètement d'accord avec toi, sur ce point précis non. L'initialisation des handlers d'images n'est pas automatique, et on doit l'ajouter à la méthode OnInit() de la classe wx.App si on veut que tous les formats d'images soient reconnus (j'ai expérimenté).

Je suis content de rencontrer un contributeur au projet wxpython dont je suis un adepte forcené smile.

Il est dommage que tu ne travailles que sur windows, car j'ai pu constater des différences de comportement de certains wxWidgets entre les deux OS que je n'ai jamais pu m'expliquer.

Hors ligne

Haut de page ↑