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

PyQt Python Discussion :

Mise à jour/affichage des données dans un QTextEdit, a l'aide


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Points : 17
    Points
    17
    Par défaut Mise à jour/affichage des données dans un QTextEdit, a l'aide
    Bonsoir,

    Je me présente je suis prof d'arts plastiques en collège et je suis en train de créer une application qui transforme mes préparations de séquences prof en fiches élèves (la fiche que je distribue aux élèves et sur laquelle tout le travail demandé est expliqué, ainsi que les questions auxquelles ils doivent répondre, les références artistiques, ainsi que les domaines d'évaluation). Je code une GUI avec PyQt4 et Python 2.7 (je sais Python 2.7 c'est ancien au regard de Python 3, ... peut-être qu'un de ces quatre je mettrais à niveau l'application afin que cela fonctionne sous Python 3).

    Le principe est que l'utilisateur a déjà préparé sa séquence (pour l'instant sous Libre Office) et que par l'intermédiaire de l'application il rentre un certain nombre de paramètres (voir la copie d'écran jointe), ces réglages sont répartis (pour l'instant dans 3 onglets), ensuite il clique sur le bouton Fiche élève pour produire la fiche élève au format pdf (pour l'instant j'utilise wkhtmltopdf [embarqué dans l'appli] par l'intermédiare de subprocess pour faire le boulot). Les boutons Feuille évaluation séquence et Feuille évaluation journalière ne sont pas encore connectés, mais ça devrait aller, c'est pas le plus compliqué. Tout fonctionne bien mais j'aimerais que le QTextEdit m'affiche le résultat du processus après avoir cliqué sur le bouton Fiche élève et c'est là que ça coince, j'ai essayé diverses choses mais sans succès ... humhum je suis loin d'être un pro c'est clair ! Pouvez-vous m'aider ?

    Les données sont (tout au long du processus, par les réglages de l'utilisateur et celles récupérées dans le fichier odt de préparation prof) écrites dans un fichier pickle que l'application récupère pour l'écriture de la fiche élève. Le QTextEdit affiche les données de la dernière fiche élève, c'est ce que je veux, mais j'aimerais qu'il affiche aussi (en dessous) les données du traitement qui vient de s'effectuer, et là je sais pas faire !, donc à l'aide ! J'aimerais aussi qu'on m'aide aussi pour activer la barre de progression.

    Voilà une partie du code de la GUI, si quelqu'un a une solution pas trop compliquée ... le QTextEdit qui doit recevoir l'affichage se trouve dans la classe FenetreWidget, il se nomme self.textEdit. La fiche élève est exécutée dans la classe BoutonsFenetrePrincipale (quand on clique sur le bouton Fiche élève, la fonction moteur_exec_fiche_eleve est appelée, ... qui par l'intermédiaire de la classe Arts_plast appelle tour à tour les fonctions collecte_donnees et exec_partie_fiche_eleve. Je voudrais que self.textEdit se mette à jour avec les éléments fournis des print (je peux aussi définir des variables collectant les éléments, et/ou remplir une liste avec ces données) des fonctions citées précédemment ... une fois que le bouton Fiche élève est cliqué.

    Comment mettre à jour self.textEdit avec ces éléments ?

    J'espère que je ne me suis pas trop embrouillé dans mes explications ...

    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from configuration_artp.artp_config import CheminConfig, Config
     
    from moteur_artp.exec_fiche_eleve_feuille_evaluation import Arts_plast
     
    from affichage_artp.couleurs_style import StyleCouleurs
     
    import sys, os, platform, pickle, shutil
     
    from PyQt4 import *
    from PyQt4.QtCore import *
    from PyQt4.QtCore import QT_VERSION_STR, PYQT_VERSION_STR
    from PyQt4.QtGui import *
     
    ...
     
    class ArtP_GUI(QMainWindow):
        # Classe GUI principale
        def __init__(self):
            super(ArtP_GUI, self).__init__()
     
            # Appel de la classe de configuration Séquence et Eval
            self.ng = Config()
            # Appel de la classe des couleurs de la GUI
            self.st = StyleCouleurs()
     
            self.setWindowTitle('ArtP')
     
            # Définit le style (ici les couleurs)
            # de la fenêtre principale, de la boîte
            # de dialogue d'ouverture des fichiers ...
            # par l'intermédiaire de :
            # .../affichage_artp/couleurs_style.py
            # --> classe StyleCouleurs
            self.setStyleSheet(self.st.styleCouleurs)
     
            self.resize(400, 440)
            self.setGeometry(200, 200, 400, 440)
     
            # Appel de la fonction affichant le menu
            self.menus()
     
            # ============================================= #
            # Boîte d'onglets
            self.tab_widget = QTabWidget()
     
            # Appel des classes contenant le groupement de widgets
            self.win_widget_1 = FenetreWidget(self)
            self.win_widget_2 = ConfigurationSequence(self)
            self.win_widget_3 = MiseEnPageSequenceEleve(self)
            self.win_widget_4 = ConfigurationGenerale(self)
            self.win_widget_5 = Info(self)
            # Le widget
            widget = QWidget()
     
            layout = QVBoxLayout(widget)
            # On rajoute chaque onglet
            self.tab_widget.addTab(self.win_widget_1, u"Exécution")
            self.tab_widget.addTab(self.win_widget_2, u"Configuration de la séquence")
            self.tab_widget.addTab(self.win_widget_3, u"Mise en page de la fiche élève")
            self.tab_widget.addTab(self.win_widget_4, u"Configuration générale")
            self.tab_widget.addTab(self.win_widget_5, u"Informations")
     
            # Classe des boutons de l'interface
            self.bout = BoutonsFenetrePrincipale(self)
     
            layout.addWidget(self.tab_widget)
            layout.addWidget(self.bout)
     
            self.setCentralWidget(widget)
            # ============================================= #
     
        def menus(self) :
            # =================================================================== #
            # MENUS
            # =================================================================== #
            menubar = self.menuBar()
     
            # Les différents menus
            menu_fichier = menubar.addMenu('&Fichier')
     
            # Sous-menu Ouvrir fichier du menu Fichier
            #quitterAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self)
            ##ouvrirFichierAction = QAction(u'Ouvrir fichier (prépa prof)', self)
            ouvrirFichierAction = QAction(u'Ouvrir fichier (prepa prof)', self)
            ouvrirFichierAction.setShortcut('Ctrl+O')
            ouvrirFichierAction.setStatusTip(u'Ouvrir le fichier opt (OpenOffice) de la préparation prof.')
     
            ## Sous-menu Quitter du menu Fichier
            #quitterAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self)
            quitterAction = QAction('Quitter', self)
            quitterAction.setShortcut('Ctrl+Q')
            quitterAction.setStatusTip("Quitter l'application.")
     
            # Sous-menus associés au menu Fichier
            menu_fichier.addAction(ouvrirFichierAction)
            menu_fichier.addAction(quitterAction)
     
            # Signal pour ouvrir un fichier odt (OpenOffice) de
            # préparation prof d'une séquence
            ouvrirFichierAction.triggered.connect(self.ouvrir)
            # Signal de l'action du sous-menu Quitter
            quitterAction.triggered.connect(self.quitter)
     
     
        def quitter(self) : sys.exit(0)
     
        def ouvrir(self):
            #
            # Boîte de dialogue d'ouverture
            self.ouvFichier = QFileDialog.getOpenFileName(self, 'Ouvrir fichier odt', os.path.expanduser('~'), 'Fichiers odt (*.odt)')
            # Définit le style (ici les couleurs)
            # de la fenêtre principale, de la boîte
            # de dialogue d'ouverture des fichiers ...
            # par l'intermédiaire de :
            # .../affichage_artp/couleurs_style.py
            # --> classe StyleCouleurs
            self.setStyleSheet(self.st.styleCouleurs)
            # Récupération des données (le chemin)
            self.chemin_fichier = unicode(self.ouvFichier)
            # ==================================================================== #
            # Quoi qu'il arrive le fichier configuration.artp (dans le répertoire
            # configuration_artp) est réecrit avec les nouvelles données avec les
            # données entrées par l'utilisateur
            # ==================================================================== #
            # Lecture par l'intermédiaire de la fonction
            # lecturePickleConfig de la classe Config
            # Ouverture du fichier de config Pickle
            ouvp = self.ng.lecturePickleConfig()
            # Intégration des réglages à l'indice 4
            self.listeConfig = [ouvp[0], ouvp[1], ouvp[2], ouvp[3], [self.chemin_fichier], ouvp[5], ouvp[6], ouvp[7], ouvp[8], ouvp[9], ouvp[10], ouvp[11], ouvp[12], ouvp[13], ouvp[14], ouvp[15], ouvp[16], ouvp[17], ouvp[18], ouvp[19]]
            # Ecriture par l'intermédiaire de la fonction
            # ecriturePickleConfig de la classe Config
            # Ecriture du fichier de config Pickle
            self.ng.ecriturePickleConfig(self.listeConfig)
            print ''
            print 'DEBUGAGE OUVERTURE DU FICHIER ODT : ', self.ng.lecturePickleConfig()
            print ''
     
     
    class BoutonsFenetrePrincipale(QWidget):
        #
        def __init__(self, parent):
            super(BoutonsFenetrePrincipale, self).__init__(parent)
     
            #################################
            # Appel de la classe FenetreWidget ... avec un QWidget
            #self.fen_wid = FenetreWidget(parent=None)
            #################################
     
            self.layout = QHBoxLayout(self)
     
            self.boutonExecFicheEleve = QPushButton(u'Fiche élève')
            self.layout.addWidget(self.boutonExecFicheEleve)
            self.boutonExecFicheEleve.setToolTip (u"Exécution, construction de la fiche élève")
     
            self.boutonExecFeuilleEval_S = QPushButton(u'Feuille évaluation séquence')
            self.layout.addWidget(self.boutonExecFeuilleEval_S)
            self.boutonExecFeuilleEval_S.setToolTip (u"Exécution, construction de la feuille d'évaluation de la séquence travaillée")
     
            self.boutonExecFeuilleEval_J = QPushButton(u'Feuille évaluation journalière')
            self.layout.addWidget(self.boutonExecFeuilleEval_J)
            self.boutonExecFeuilleEval_J.setToolTip (u"Exécution, construction de la feuille d'évaluation journalière")
     
            # ============================================= #
            # Actions, connections des boutons
            # ============================================= #
            # Exécution (moteur) Fiche élève
            self.boutonExecFicheEleve.clicked.connect(self.moteur_exec_fiche_eleve)
            # Exécution (moteur) Feuille évaluation séquence
            self.boutonExecFeuilleEval_S.clicked.connect(self.moteur_exec_feuille_evaluation_S)
            # Exécution (moteur) Feuille évaluation journalière
            self.boutonExecFeuilleEval_J.clicked.connect(self.moteur_exec_feuille_evaluation_J)
            # ============================================= #
            self.setLayout(self.layout)
     
        def moteur_exec_fiche_eleve(self) :
            #
            print ''
            print u"Exécution Moteur Fiche Elève"
            print ''
     
            # Appel de la classe Arts_plast
            self.ap = Arts_plast()
            # Exécution de la fonction collecte_de_donnees de la classe Arts_plast
            # (fichier moteur_artp/exec_fiche_eleve_feuille_evaluation.py)
            self.ap.collecte_donnees()
            # Exécution de la fonction exec_partie_fiche_eleve de la classe Arts_plast
            # (fichier moteur_artp/exec_fiche_eleve_feuille_evaluation.py)
            self.ap.exec_partie_fiche_eleve()
     
            print ''
            print 'FICHIER ODT : ', self.ap.fichier_charger
            print ''
     
        def moteur_exec_feuille_evaluation_S(self) :
     
            print "moteur_exec_feuille_evaluation_S"
     
        def moteur_exec_feuille_evaluation_J(self) :
     
            print "moteur_exec_feuille_evaluation_J"
     
     
    class FenetreWidget(QWidget) :
        # Classe qui contrôle les widgets de la MainWindow
        def __init__(self, parent):
            super (FenetreWidget , self).__init__(parent)
     
            # Appel de la classe Config
            self.conf = Config()
            # Ouverture du fichier de config
            ouvp = self.conf.lecturePickleConfig()
     
            # Widgets et leur répartition dans la MainWindow
            groupe_1 = QGroupBox()
            groupe_2 = QGroupBox()
            # Les widgets du GROUPE 1
            self.textEdit = QTextEdit()
            self.textEdit.setReadOnly(True)
     
            # Sélection pour affichage des compétences travaillées
            liste_comp_travail = [str(n+1)+") --> "+str(ct) for n, ct in enumerate(ouvp[2])]
            # Sélection pour affichage des points chiffrés associés aux compétences travaillées
            liste_pts_chiffres = [str(n+1)+") --> "+str(pc) for n, pc in enumerate(ouvp[3])]
            # Sélection pour affichage de la résolution de chaque vignette des références artistiques
            liste_refs_artstistiques = [str(n+1)+") --> "+str(refa) for n, refa in enumerate(ouvp[0])]
     
            # Ce qui va s'afficher à l'ouverture dans
            # le QTextEdit (liste des paramètres)
            liste_affichage_prealable = ["<p><u><b>DETAILS DU FICHIER PRECEDEMMENT OUVERT :</b></u></p>", \
            u"<p><u><b>Chemin et nom du fichier de la préparation prof :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[4][0]), \
            u"<p><u><b>Chemin et nom du fichier de la liste des élèves :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[5][0]), \
            u"<p><u><b>Niveau de classe chargé :</b></u><font style='color:#5fb1ae;'> <b>{0}ème</b></font></p>".format(ouvp[1]), \
            u"<p><u><b>Liste des compétences travaillées sélectionnées :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(liste_comp_travail), \
            u"<p><u><b>Liste des points chiffrés associés aux compétences travaillées :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(liste_pts_chiffres), \
            u"<p><u><b>Liste de la résolution (en pixels) des vignettes des références artistiques :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(liste_refs_artstistiques), \
            u"<p><u><b>Réglages fichier PDF (marge gauche, droite, haut et bas), DPI, zoom et taille police :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[6]), \
            u"<p><u><b>Chemin de sauvegarde des fiches élèves niveau 6ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[10][0]), \
            u"<p><u><b>Chemin de sauvegarde des fiches élèves niveau 5ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[10][1]), \
            u"<p><u><b>Chemin de sauvegarde des fiches élèves niveau 4ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[11][0]), \
            u"<p><u><b>Chemin de sauvegarde des fiches élèves niveau 3ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[11][1]), \
            u"<p><u><b>Chemin de sauvegarde des feuilles d'évaluation niveau 6ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[12][0]), \
            u"<p><u><b>Chemin de sauvegarde des feuilles d'évaluation niveau 5ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[12][1]), \
            u"<p><u><b>Chemin de sauvegarde des feuilles d'évaluation niveau 4ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[13][0]), \
            u"<p><u><b>Chemin de sauvegarde des feuilles d'évaluation niveau 3ème :</b></u><font style='color:#5fb1ae;'> <b>{0}</b></font></p>".format(ouvp[13][1])]
     
            # Affichage dans le QTextEdit
            for parc in liste_affichage_prealable :
                self.textEdit.moveCursor(QTextCursor.End)
                self.textEdit.setHtml
                self.textEdit.append(parc)
     
            # ============================================= #
            self.barre_progression = QProgressBar()
            #self.barre_progression.setMinimum(0)
            #self.barre_progression.setMaximum(100)
            self.barre_progression.setRange(0, 100)
            self.barre_progression.reset()  # reset la barre de progression
            self.barre_progression.setAlignment(Qt.AlignCenter)  # centre le texte
            self.barre_progression.setGeometry(200, 80, 250, 20)
            self.barre_progression.setValue(25) ### A CHANGER !!!
            # ============================================= #
            # Grille 1
            # ============================================= #
            grid_1 = QGridLayout()
            grid_1.setSpacing(10)
            # ============================================= #
            # Grille 1
            # ============================================= #
            grid_2 = QGridLayout()
            grid_2.setSpacing(10)
            # ============================================= #
            # Répartition en grille des widgets du GROUPE 1 (QGridLayout)
            # ============================================= #
            grid_1.addWidget(self.textEdit, 0, 0)
            grid_1.addWidget(self.barre_progression, 1, 0)
            # Alignement/centrage sur la hauteur des widgets
            grid_1.setAlignment(Qt.AlignVCenter)
            #grid_2.setAlignment(Qt.AlignVCenter)
            # ============================================= #
            # Actions, connections des widgets du GROUPE
            # ============================================= #
     
            # ============================================= #
            groupe_1.setLayout(grid_1)
     
            layout = QGridLayout()
            layout.setSpacing(4)
            layout.addWidget(groupe_1, 0, 0)
            # ============================================= #
            self.setLayout(layout)
    Merci d'avance.

    A bientôt.

    Nom : capture_artp_002.png
Affichages : 906
Taille : 47,4 KoNom : capture_artp_001.png
Affichages : 936
Taille : 50,6 Ko

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 483
    Points : 9 282
    Points
    9 282
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on veut forcer un affichage qui ne se fait pas assez rapidement, on peut utiliser ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    Cela a pour effet de forcer l'exécution des évènements à traiter (dont l'affichage) dans la pile des évènements en attente.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Quand on veut forcer un affichage qui ne se fait pas assez rapidement, on peut utiliser ceci:
    ...
    Cela a pour effet de forcer l'exécution des évènements à traiter (dont l'affichage) dans la pile des évènements en attente.
    Merci pour la réponse. Le problème n'est toujours pas résolu. Le processEvents ne change rien.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 483
    Points : 9 282
    Points
    9 282
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par ekdmekdm Voir le message
    Le processEvents ne change rien.
    Bizarre, je l'utilise souvent, et ça marche bien. Il faut le mettre juste après l'instruction d'affichage pour que cet affichage se fasse en temps réel.

Discussions similaires

  1. [AC-2010] Mise en forme de l'affichage des données dans une liste de choix déroulante
    Par Nephi dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 17/09/2010, 14h40
  2. [DeskI V5-V6] Mise à jour auto des données dans la colonne variation
    Par lenka33 dans le forum Débuter
    Réponses: 17
    Dernier message: 31/08/2009, 13h09
  3. Mise à jour base des données modifiées dans le DataGridView
    Par dolyne.b dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/04/2007, 16h58
  4. Réponses: 6
    Dernier message: 17/07/2006, 16h07
  5. Affichage des données dans un état
    Par puppusse79 dans le forum Access
    Réponses: 8
    Dernier message: 07/04/2006, 17h36

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