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

Calcul scientifique Python Discussion :

Graphiques qui ne s'affichent pas avec Matplotlib intégré dans Qt5


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Graphiques qui ne s'affichent pas avec Matplotlib intégré dans Qt5
    Bonjour ,

    J'aie 3 canevas avec 4 boutons dans une fenêtre faite avec Qt5 . Je ne reussis pas à afficher les courbes des fonctions nommées "plotsin" et "plotcos" dans les canevas respectif .C'est tout ...Voici le code .(Je développe en tant qu'amateur occasionnel)

    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
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Wed May  9 12:20:55 2018
     
    @author: saltz
    """
     
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Tue Apr 24 20:00:02 2018
     
    @author: saltz
    """
    import math
    from pylab import *
    import sys
    from PyQt5 import QtGui, QtCore
    from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout ,QHBoxLayout
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
    import random
     
    from test import *   #charge le fichier test.py
     
     
    class Window(QDialog):
     
        def __init__(self, parent=None):  # _init__ est un constructeur intervient sur l'objet au moment de le créer et de le supprimer
     
            super(Window, self).__init__(parent)
            self.setUI()
     
     
            # ETAPE , ETAPE 2 et ETAPE3 marchent ensemble
        def setUI(self): 
     
            self.figure = plt.figure() # a figure instance to plot on
            self.axes = self.figure.add_subplot(111)  # mets des axes x et y sur les 3 canvas d'un coup
            self.canvas = FigureCanvas(self.figure)
     
     
            self.canvas1 = FigureCanvas(self.figure)
            self.canvas2 = FigureCanvas(self.figure)
     
            self.toolbar = NavigationToolbar(self.canvas, self) # this is the Navigation widget it takes the Canvas widget and a parent
            self.toolbar1 = NavigationToolbar(self.canvas1, self)
            self.toolbar2 = NavigationToolbar(self.canvas2, self)
     
            # ETAPE 1 on creer un bouton et l'évènement qui lui associé avec connect
     
     
            button = QPushButton('Plot',self)  # regle le texte du bouton seulement et self indique le parent sur lequel doit apparaitre le bouton
            button.clicked.connect(self.plot) # appelle l'évènement click et lancer la fonction plot
     
            button1 = QPushButton('détermines la taille')  #creer le bouton nommé "détermines la taille de la position"
            button1.clicked.connect(self.boutonpositionsize)
     
            button2 = QPushButton('Graph de sin',self)
            button2.clicked.connect(self.plotsin)
     
            button3 = QPushButton("Graph de cos",self)
            button3.clicked.connect(self.plotcos)
     
     
     
            # ETAPE 2 on affiche les widgets sur un layout
            layoutH=QHBoxLayout()
            layoutV = QVBoxLayout() # set the layout  creer un calque et sur le calque on mettra des boutons rmq c'est un layout VERTICAL ici
            layoutV.addWidget(self.toolbar)  # c'est seulement ici que la barre d'outils est crée
            layoutV.addWidget(self.canvas)  # .addWidget ajoute un widget dans un layout 
     
            layoutV.addWidget(self.toolbar1) # toolbar1 avant canvas1 donc à l'écran toolbar1 et au dessus de canvas1 .C'est cette ligne qui implante la toolbar à un endroit choisi de la fenetre
            layoutV.addWidget(self.canvas1) # ne pas confondre avec .addLayout qui ajoute un layout dans un autre layout permettant ainsi de les combiner
     
            layoutV.addWidget(self.toolbar2)
            layoutV.addWidget(self.canvas2)
     
            layoutH.addWidget(button) # c'est seulement ici que le bouton apparaitra à l'écran
            layoutH.addWidget(button1) # c'est seulement ici que le bouton1 apparaitra à l'écran
            layoutH.addWidget(button2)# c'est seulement ici que le pushButton_2 apparaitra à l'écran
            layoutH.addWidget(button3)
     
            layoutV.addLayout(layoutH)
     
            # ETAPE 3/ On dit à la fenêtre d'utiliser le layout qu'on a créé
            self.setLayout(layoutV)  #avantages permet aux boutons et Canvas de suivre la grandeur de la fenetre
     
        def boutonpositionsize(self):
     
            #test.positionsize  #appelle la fonction positionsize située dans le fichier test.py
            positionsize()
     
        def plot(self):
     
            # random data
            data = [random.random() for i in range(10)]  # ceci est une façon originale de créer une liste rapidement
            self.figure.clear()
            ax = self.figure.add_subplot(111) # create an axis
            ax.plot(data, '*-') # plot data
            self.canvas.draw() # refresh canvas
            ax.set_title('Données aléatoires')
     
        def plotsin():
     
            self.y = sin(self.x)
            self.line.set_ydata(self.y)
            self.canvas1.draw()
     
        def plotcos(self):
     
            self.y = cos(self.x)
            self.line.set_ydata(self.y )
            self.canvas2.draw()
     
    if __name__ == '__main__':   # encapsule main avec une structure conditionnel afin de séparer le code d'un éventuel import 
     
        app = QApplication(sys.argv)
        main = Window()  # appelles la class nommée windows ci dessous , cela marche aussi avec une fonction def nomdunefonction
        main.setGeometry(0, 0, 600, 600 ) # 0,0 sert à caler la fenetre à l'écran sachant que 0 ,0 designer un point en haut à gauche de l'écran
                                          # met les dimensions de la fenetre par défaut ici 600*600
        main.setWindowTitle("Incorporer matplotlib dans une fenetre faite avec Qt5 , c'est FUN  !!") # met un titre à la fenetre
     
        main.show()
     
        sys.exit(app.exec_())

  2. #2
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ci dessous un code probablement avec le même genre de soucis . Le bouton est connecté car la fonction "print" s'execute dans la console .
    Par contre QMessageBox , refuse de s'afficher . Cela doit être trés simple , le but est de faire s'afficher un simple "hello world"
    C'est la ligne 46 qui ne s'execute pas . Pas de message d'erreur , rien du tout pour m'aider mais rien ne se passe non plus ;

    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
     
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'hop.ui'
    #
    # Created by: PyQt5 UI code generator 5.6
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox
    import sys
    from PyQt5.QtCore import pyqtSlot
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
     
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(220, 310, 89, 25))
            self.pushButton.setObjectName("pushButton")
            self.pushButton.clicked.connect(self.messageboxtest)
     
            MainWindow.setCentralWidget(self.centralwidget)
     
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
     
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
     
            self.retranslateUi(MainWindow)
     
     
     
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def messageboxtest(self):
            print ("test simple")
            QMessageBox.information(self,"Ma message Box","Bonjour à tous et bienvenue!" ,"")
     
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.pushButton.setText(_translate("MainWindow", "PushButton"))
     
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())

  3. #3
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Finalement , j'aie un petit message d'erreur indicatif en lançant le script à partir de la console .Le paramètre self ne semble pas bien digéré .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    saltz@saltz-OptiPlex-780:~/Bureau$ python3.6 hop.py
    test simple
    Traceback (most recent call last):
      File "hop.py", line 45, in messageboxtest
        QMessageBox.information(self,"Ma message Box","Bonjour à tous et bienvenue!" ,"")
    TypeError: information(QWidget, str, str, buttons: Union[QMessageBox.StandardButtons, QMessageBox.StandardButton] = QMessageBox.Ok, defaultButton: QMessageBox.StandardButton =
     QMessageBox.NoButton): argument 1 has unexpected type 'Ui_MainWindow'
    Abandon (core dumped)
    saltz@saltz-OptiPlex-780:~/Bureau$

  4. #4
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Finalement , j'arrive un peu mieux avec les boutons et les messageBox .
    Mais je me perd dans les objets et j'aie une fenetre d'un objet "figure en trop" .
    Si quelqu'un peut m'aider à purger mon code ou bien quelques conseils généraux de base
    car je m'égare parmi les objets et chaque modification dans le code provoque souvent un
    effet indésirable .

    Voici mon code qui tend le plus vers ce que je veux .

    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
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Tue Apr 24 20:00:02 2018
     
    @author: saltz
    """
    import math
    import sys
    from PyQt5 import QtGui, QtCore
    from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout ,QHBoxLayout ,QMessageBox
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
    import numpy as np
    import random
     
    from Fig9_21_dynamic_position_size import *   #charge le fichier Fig9_21_dynamic_position_size.py
     
     
    class Window(QDialog):
     
        def __init__(self, parent=None):  # _init__ est un constructeur intervient sur l'objet au moment de le créer et de le supprimer
     
            super(Window, self).__init__(parent)
            self.setUI()
     
     
            # ETAPE , ETAPE 2 et ETAPE3 marchent ensemble
        def setUI(self):
            #main = Window()  # appelles la class nommée windows ci dessous , cela marche aussi avec une fonction def nomdunefonction
            self.setGeometry(0, 0, 600, 600 ) # 0,0 sert à caler la fenetre à l'écran sachant que 0 ,0 designer un point en haut à gauche de l'écran
                                          # met les dimensions de la fenetre par défaut ici 600*600
            self.setWindowTitle("Incorporer matplotlib dans une fenetre faite avec Qt5 , c'est FUN  !!") # met un titre à la fenetre
     
     
            self.figure = plt.figure() # a figure instance to plot on
            self.axes = self.figure.add_subplot(111)  # mets des axes x et y sur les 3 canvas d'un coup
            self.canvas = FigureCanvas(self.figure)
     
     
            self.canvas1 = FigureCanvas(self.figure)
            self.canvas2 = FigureCanvas(self.figure)
     
            self.toolbar = NavigationToolbar(self.canvas, self) # this is the Navigation widget it takes the Canvas widget and a parent
            self.toolbar1 = NavigationToolbar(self.canvas1, self)
            self.toolbar2 = NavigationToolbar(self.canvas2, self)
     
            # ETAPE 1 on creer un bouton et l'évènement qui lui associé avec connect
     
     
            button = QPushButton('Plot',self)  # regle le texte du bouton seulement et self indique le parent sur lequel doit apparaitre le bouton
            button.clicked.connect(self.plot) # appelle l'évènement click et lancer la fonction plot
     
            button1 = QPushButton('détermines la taille')  #creer le bouton nommé "détermines la taille de la position"
            button1.clicked.connect(self.boutonpositionsize)
     
            button2 = QPushButton('Graph de sin',self)
            button2.clicked.connect(self.plotsin)
     
            button3 = QPushButton("Graph de cos,",self)
            button3.clicked.connect(self.plotcos)
     
     
     
            # ETAPE 2 on affiche les widgets sur un layout
            layoutH=QHBoxLayout()  # creer un layout Horizontal
            layoutV = QVBoxLayout() # set the layout  creer un calque et sur le calque on mettra des boutons rmq c'est un layout VERTICAL ici
            layoutV.addWidget(self.toolbar)  # c'est seulement ici que la barre d'outils est crée
            layoutV.addWidget(self.canvas)  # .addWidget ajoute un widget dans un layout 
     
            layoutV.addWidget(self.toolbar1) # toolbar1 avant canvas1 donc à l'écran toolbar1 et au dessus de canvas1 .C'est cette ligne qui implante la toolbar à un endroit choisi de la fenetre
            layoutV.addWidget(self.canvas1) # ne pas confondre avec .addLayout qui ajoute un layout dans un autre layout permettant ainsi de les combiner
     
            layoutV.addWidget(self.toolbar2)
            layoutV.addWidget(self.canvas2)
     
            layoutH.addWidget(button) # c'est seulement ici que le bouton apparaitra à l'écran
            layoutH.addWidget(button1) # c'est seulement ici que le bouton1 apparaitra à l'écran
            layoutH.addWidget(button2)# c'est seulement ici que le pushButton_2 apparaitra à l'écran
            layoutH.addWidget(button3)
     
            layoutV.addLayout(layoutH)
     
            # ETAPE 3/ On dit à la fenêtre d'utiliser le layout qu'on a créé
            self.setLayout(layoutV)  #avantages permet aux boutons et Canvas de suivre la grandeur de la fenetre
     
    #        self.show()
     
            #        **********************************************************************
     
     
        def boutonpositionsize(self):
     
            #Fig9_21_dynamic_position_size.positionsize  #appelle la fonction positionsize située dans le fichier Fig9_21_dynamic_position_size.py
            positionsize()
     
        def plot(self):
     
            # random data
            data = [random.random() for i in range(10)]  # ceci est une façon originale de créer une liste rapidement
            self.figure.clear()
            ax = self.figure.add_subplot(111) # create an axis
            ax.plot(data, '*-') # plot data
            self.canvas.draw() # refresh canvas
            ax.set_title('Données aléatoires')
     
        def plotsin(self):
     
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
            msg.setText("This is a message box")
            msg.setInformativeText("This is additional information")
            msg.setWindowTitle("MessageBox demo")
            msg.setDetailedText("The details are as follows:")
            msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            msg.exec_() # c'est .exec_() qui fait s'afficher la message box à l'écran
     
    #        self.y = sin(self.x)
    #        self.line.set_ydata(self.y)
    #        self.canvas1.draw()
     
        def plotcos(self):
     
     
            x = np.linspace(0, 2*np.pi, 30)
            y = np.cos(x)
            axcos = self.figure.add_subplot(111) # create an axis
            axcos.plot(x, y)
            self.canvas2.draw() # refresh canvas
            axcos.set_title('Cosinus')
     
     
    if __name__ == '__main__':   # encapsule main avec une structure conditionnel afin de séparer le code d'un éventuel import 
     
        app = QApplication(sys.argv)
        main = Window()  # appelles la class nommée windows ci dessous , cela marche aussi avec une fonction def nomdunefonction
    #    main.setGeometry(0, 0, 600, 600 ) # 0,0 sert à caler la fenetre à l'écran sachant que 0 ,0 designer un point en haut à gauche de l'écran
    #                                      # met les dimensions de la fenetre par défaut ici 600*600
    #    main.setWindowTitle("Incorporer matplotlib dans une fenetre faite avec Qt5 , c'est FUN  !!") # met un titre à la fenetre
        main.show()
     
        sys.exit(app.exec_())

  5. #5
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour

    Il y a surement plein de chose à dire. Je vais déjà en énumérer quelques unes :
    1) Ton code n'a rien d'un code scientifique (c'est pas parcequ'on s'amuse à tracer des fonctions que c'est scientifique). Ton problème relève d'une interface graphique, donc ton topic serait mieux dans le forum Python général sur lequel la communauté est plus importante voire même carrément dans la rubrique GUI.
    Les forums python sont ici :
    https://www.developpez.net/forums/f9...s/python-zope/
    Postez dans le bons forums augmentent les chances d'avoir une réponse satisfaisante.

    2) Pour qu'on puisse t'aider, fournit un code qui se suffise à lui même pour que chaque internaute qui passe par là, soit en mesure d'éxécuter ton code. Là tu as une dépendance à Fig9_21_dynamic_position_size dont toi seul a une idée de ce qu'il y a dedans.

    3) Problème de conception : Pourquoi plotsin et plotcos ne sont pas exactement les mêmes fonctions à part juste le cos qui se change en sin ? Si tu ne veux pas les faire afficher au meme endroit suffit peut etre de rajouter un parametre pour l'endroit justement. D'ailleurs je dirais que ces 2 fonctions devraient elle même dépendre de la fonction plot tout simplement qui devrait prendre en paramètre à minima x et y...

    Je ne suis pas un expert PyQT, donc après difficile de t'en dire plus. Mais j'espère que cela t'aura fait avancé au moins.

  6. #6
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Effectivement , j'aurais du mettre le code sur le forum PyQt car ce sont les objets Qt que je ne maitrise pas ...

Discussions similaires

  1. Tracé GPX qui ne s'affiche pas avec printMap
    Par edwix dans le forum IGN API Géoportail
    Réponses: 5
    Dernier message: 14/05/2011, 21h42
  2. Caractère qui ne s'affiche pas avec IE
    Par Rian83 dans le forum Langage
    Réponses: 12
    Dernier message: 31/03/2009, 20h59
  3. Graphiques qui ne s'affichent pas dans cacti
    Par tet2brick dans le forum Ubuntu
    Réponses: 1
    Dernier message: 19/03/2009, 21h17
  4. Infobulle en CSS qui ne s'affiche pas avec Opera
    Par xenos dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 27/02/2007, 12h03
  5. Réponses: 3
    Dernier message: 02/05/2006, 14h29

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