Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 17 sur 17
  1. #1
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut [Tkinter] Python 2.6 - Quel outil utiliser en remplacement du print()

    Bonjour,

    Après avoir développé un beau petit programme, je cherche à réaliser une interface avec Tkinter. J'ai donc un premier bloc, une sorte de formulaire de configuration de départ que j'ai réalisé ces jours-ci.

    Je me pose maintenant la question de savoir comment afficher les prints de mon programme qui m'informe sur le déroulement et le bon fonctionnement du programme. (Je souhaite en effet passer mon programme en .exe pour faciliter la portabilité sur d'autres postes)

    Du coup j'ai pensé à ça :

    Code :
    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
    from Tkinter import *
     
    def repondre4():
        global reponselog
        affichage4['text'] = reponse4.get()      # lecture du contenu du widget "reponse"
        reponselog=str(affichage4['text'])
     
    def print1(message):
        Message(root, text=message, bg='white',fg='black', relief=GROOVE).pack(padx=150, pady=150)
     
    def femetureetlancement():
        if reponselog=="oui" or reponselog=="non":
            Fenetre.destroy()
     
    Fenetre = Tk()
    Fenetre.title("""Parametrage""") # un bref apercu de la configuration de départ
     
    blanc4=Label(Fenetre, text = "")
     
    reponseloga = Label(Fenetre, text = """Voulez vous enregistrer le choix des fichiers sur un fichier config ? oui/non""")
    reponse4 = Entry(Fenetre)
    valeur4 = Button(Fenetre, text =' Valider', command=repondre4)
    affichage4 = Label(Fenetre, width=150)
    reponselogdit=Label(Fenetre, text="""Votre réponse est:""")
     
    bouton_sortir = Button(Fenetre,text="Valider les réponses et sortir",command=femetureetlancement)
     
    reponseloga.pack()
    reponse4.pack()
    valeur4.pack()
    reponselogdit.pack()
    affichage4.pack()
    blanc4.pack()
     
    bouton_sortir.pack()
    Fenetre.mainloop()
     
    """
    root = Tk()
    root.title('Avancé du programme')
    print1("je suis là") ##### Simulation du code principal
    n=0                    ##### Simulation du code principal
    while n<10000:    ##### Simulation du code principal
        n=n+1            ##### Simulation du code principal
    print1("puis ici")   ##### Simulation du code principal
     
    bouton_sortir1 = Button(root,text="Valider les réponses et sortir",command=root.destroy())
    bouton_sortir1.pack()
    root.mainloop()
    """
    Donc avec print1() , fonction qui me permettrait de visualiser l'avancé de mon programme...

    Sauf que je suis novice en Tkinter (et Python aussi) et que je ne comprends pas tout à fait comment fonctionne les mainloop ?

    Quand j'essaie de démarrer une nouvelle fenetre "root" (deuxième partie du script), erreur fenetre détruite, oui certes, mais pas moyen d'en reconstruire une ??

    Et donc troisième question : Dans ma fonction print1(message), Comment vider le contenu de "message", ou plutôt, comment virer le contenu dans ma fenetre root et inserer un nouveau "message" (correspondant à un nouvel appel de print1() message, dont à un avancement dans mon programme)


    Et encore une petite dernière question :
    Là j'ai un script total qui correspond à ceci...

    [Fenetre] (formulaire de configuration)
    (qui permet de réaliser...)
    [CODE DEVELOPPE]

    C'est dans ce code développé que je voudrais appelé print1(), donc root.mainloop() serait tout à la fin de mon code ?

    Merci de vos réponses

    Titi

  2. #2
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 834
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 834
    Points : 2 848
    Points
    2 848

    Par défaut

    Quand j'essaie de démarrer une nouvelle fenetre "root" (deuxième partie du script), erreur fenetre détruite, oui certes, mais pas moyen d'en reconstruire une ??
    Voir du côté du widget Toplevel

    Et donc troisième question : Dans ma fonction print1(message), Comment vider le contenu de "message", ou plutôt, comment virer le contenu dans ma fenetre root et inserer un nouveau "message" (correspondant à un nouvel appel de print1() message, dont à un avancement dans mon programme)
    Dans tous les widgets il existe un moyen de le détruire, voir de l'updater, il faut chercher de ce côté.

    C'est dans ce code développé que je voudrais appelé print1(), donc root.mainloop() serait tout à la fin de mon code ?
    Dans tous les cas à la fin, c'est lui qui permet la gestion des évènements.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    Bonjour,

    J'ai regardé du coté de Toplevel et j'arrive à mes fins. Mais alors pour ce qui est de l'update...


    Citation Envoyé par fred1599 Voir le message
    Dans tous les widgets il existe un moyen de le détruire, voir de l'updater, il faut chercher de ce côté.

    ...j'ai vraiment rien trouvé

  4. #4
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    Voilà où j'en suis en fait:

    Code :
    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
    from Tkinter import *
     
    root = Tk()
     
     
    def Lancement():
        n=0
        while n<10:
            ecritureprint(n)
            n=n+1
            blanc9.pack()
     
    def fermeture():
        root.destroy()
     
    def ecritureprint(message):
        global blanc9
        labelVariable = StringVar()
        Fenetre=Toplevel()
        Fenetre.grab_set()
        blanc9=Label(Fenetre,labelVariable.set(message))
     
    b = Button(root, text='Lancement', command=Lancement)
    b.pack()
     
    c=Button(root, text='sortir', command=fermeture)
    c.pack()
     
    root.mainloop()

    Si quelqu'un pouvait m'indiquer le nord ?

  5. #5
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    Bon voilà où je suis avancé finalement :

    Code :
    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
     
    # -*- coding:Utf-8 -*-
     
    from Tkinter import *
     
    root = Tk()
     
     
    def Lancement():
        global Fenetre
        n=0
        Fenetre=Toplevel()
        Fenetre.grab_set()
        while n<10:
            ecritureprint(n)
            n=n+1
            blanc9.option_clear()
            blanc9.clipboard_clear
            blanc9.pack_forget()
            blanc9.selection_clear()
            blanc9.update()
            blanc9.pack()
     
     
    def fermeture():
        root.destroy()
     
    def ecritureprint(message):
        global blanc9
        labelVariable = StringVar()
        labelVariable.set(message)
        blanc9=Label(Fenetre,textvariable=labelVariable)
     
    b = Button(root, text='Lancement', command=Lancement)
    b.pack()
     
    c=Button(root, text='sortir', command=fermeture)
    c.pack()
     
    root.mainloop()
    Sauf qu'au lieu d'avoir 1 (effacé), puis 2, (effacé), puis 3 (effacé).... puis 10, j'ai une liste des valeurs...

    J'ai essayer plein de fonction pour update blanc9 mais pas moyen d'y arriver !

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    mars 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2006
    Messages : 857
    Points : 1 151
    Points
    1 151

    Par défaut

    Salut,

    Si j'ai bien compris, ton problème est d'envoyer un texte quelconque dans une fenêtre? La fonction sendToLogger le fait... Mais utilise un objet global, ce qui peut à la limite passer pour une sorte de "print", mais n'est quand même pas conseillé.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import Tkinter as tk
     
    def sendToLogger(message):
        global logger_widget
        logger_widget.insert('end', message)
        logger_widget.insert('end', '\n')
        logger_widget.see('end')
     
    root = tk.Tk()
    logger_widget = tk.Text(tk.Toplevel(), bg='black', fg='white')
    logger_widget.pack()
    for index in range(10):
        tk.Button(root, text='message %u'%index, command=lambda message='message %u'%index:sendToLogger(message)).pack()
    sendToLogger('Hello world!')
    root.mainloop()
    Désolé si ce n'est pas ce que tu cherches, c'est ce que j'ai cru comprendre de ton premier post.
    A+

    Pfeuh

  7. #7
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    En cherchant un peu j'ai trouvé ma réponse. Merci tout de même pfeuh !

    J'ai ajouté : blanc9.update_idletasks()
    et blanc9.config(textvariable=labelVariable)

    Code :
    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
    # -*- coding:Utf-8 -*-
     
    from Tkinter import *
     
    root = Tk()
    i=0 
     
    def Lancement():
        global Fenetre
        n=0
        Fenetre=Toplevel()
        Fenetre.grab_set()
        while n<10000:
            ecritureprint(n)
            n=n+1
            blanc9.update_idletasks()
            blanc9.pack()
     
    def fermeture():
        root.destroy()
     
    def ecritureprint(message):
        global blanc9, i
        labelVariable = StringVar()
        labelVariable.set(message)
        if i==0:
            blanc9=Label(Fenetre,textvariable=labelVariable)
            i=+1
        if i!=0:
            print(i)
            blanc9.config(textvariable=labelVariable)
     
    b = Button(root, text='Lancement', command=Lancement)
    b.pack()
     
    c=Button(root, text='sortir', command=fermeture)
    c.pack()
     
    root.mainloop()
    Les prints ne servant ici qu'à ralentir le programme pour ne pas qu'il aille trop vite

    Résolu !

  8. #8
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut ... Pas très concluant cette solution finalement

    Bonjour,

    Je me permet de relancer le sujet car ma solution n'est pas très fonctionnel.

    J'explique :

    J'ai un programme qui utilise en autre Tkinter pour remplir un formulaire de configuration. De ce formulaire, le programme va s'executer d'une façon spécifique. Aujourd'hui, pour utiliser mon programme j'utilise le .py . Le programme se lance normalement et j'ai des print qui apparaissent dans la fenetre cmd.exe et qui me permette de savoir où en est l'avancement du programme.

    Ce que je voudrais faire c'est compiler mon .py en .exe (ça pas de soucis) et continuer à avoir la fenetre cmd qui s'ouvre pour avoir les prints qui me renseignerait sur l'avancement du programme. Mais comment faire ?

    Je vous remercie pour votre aide et bon week-end

    (déjà cherché sur le web)
    (déjà cherché sur les divers forums)

  9. #9
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 834
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 834
    Points : 2 848
    Points
    2 848

    Par défaut

    Bonsoir,

    Il faut regarder du côté de py2exe ou de cx_freeze selon votre version python.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    J'arrive à compiler :

    Citation Envoyé par sir_nebuchadnezzar Voir le message
    Ce que je voudrais faire c'est compiler mon .py en .exe (ça pas de soucis) et continuer à avoir la fenetre cmd qui s'ouvre pour avoir les prints qui me renseignerait sur l'avancement du programme. Mais comment faire ?
    )
    Comme je le dis, je cherche quelque chose pour afficher mes messages (print) dans cmd.exe lorsque j'ai compilé mon py en exe.

    (Si je pose la question c'est que les print n'apparaissent pas dans ma version compilé)

  11. #11
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 834
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 834
    Points : 2 848
    Points
    2 848

    Par défaut

    Euh oui mais vous utilisez quoi py2exe, cx_freeze?

    Je vous rassure, vous ne compilez pas avec ni l'un ni l'autre, vous avez simplement un interpréteur python dans votre exe.

    Il y a un paramètre dans l'un ou l'autre vous permettant de faire le choix ou non de la présence de la console.

    cython oui, car il transforme votre fichier python en C, puis il compile.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 558
    Points : 8 396
    Points
    8 396

    Par défaut

    Salut,
    Pourquoi voulez vous cmd.exe après vous être donné tant de mal à afficher vos messages dans une fenêtre Tk?
    Avec quoi est généré l'exécutable?
    - W
    Architectures Post-Modernes

  13. #13
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    Bonjour et merci de vos réponses.

    J'utilise cx_freeze pour avoir mon .exe cela me permet de passer mon programme sur d'autres machines. Maintenant savoir qu'est ce qu'il y a dans ce point exe, ça n'est pas une question cruciale pour moi.

    Dans le début de ce topic, j'explique que j'ai réussi à mettre les messages dans une fenetre avec un label à l'intérieur. Le seul problème c'est que c'est le gros foutoir avec toutes ces fenetres (une fenetre principale, plusieurs fenetre d'ouverture tkFileDialog.askopenfilename, et donc la fenetre de suivi avec mon label(message) dedans. Mais l'affichage n'est pas fluide. Et puis, ce qui est bien avec cmd.exe c'est qu'on peut garder la vue sur les précédents messages (print) que ressort le programme. Pour retranscrire ca avec des label comme j'ai essayé dans ce topic, il faudrait alors que j'utilise plusieurs label avec label1=(message1) label2(message0), ect... Pas top.

    Donc, solution laissée de coté.

    Citation Envoyé par fred1599 Voir le message
    Il y a un paramètre dans l'un ou l'autre vous permettant de faire le choix ou non de la présence de la console.
    S'il y a un outil générateur de exe qui prend en compte l'ouverture de cmd.exe et qui permet d'écrire dedans Fred, je suis tout à fait preneur ! C'est ce que je recherche !

    Je vais donc regardé du côté de cython

    Merci pour vos réponses

  14. #14
    Expert Confirmé
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 834
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 834
    Points : 2 848
    Points
    2 848

    Par défaut

    Non tu n'as pas compris, avec cython, tu vas compiler, mais tu n'auras plus la console.

    Pour py2exe, tu as normalement créé un setup.py
    Regarde du côté de cette ligne

    Code :
    setup(console=["myscript.py"])
    Tu dois avoir console et non window.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  15. #15
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    D'accord, j'avais compris que Cython faisait la même chose que py2exe et cx_freeze, ce qui n'est pas le cas, ok.

    Je réalise mes exe avec cx_freeze. Il faudrait que je retrouve une façon simple pour afficher la console avec cx_freeze de la même manière que celle que tu m'as proposé .

    J'avais précédemment testé py2exe mais l'exe généré ne fonctionnait pas.

    Merci de ta réponse et désolé pour ma mauvaise compréhension. Je suis encore une jeune utilisateur de python et les notions d'informatique me surpasse parfois.

  16. #16
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 558
    Points : 8 396
    Points
    8 396

    Par défaut

    Salut,

    Si le sujet est "comment construire un executable avec cx_freeze" qui soit standalone (i.e. avec la console), pourquoi ne pas ouvrir un nouveau "topic"?

    Postez aussi le script setup.py que vous avez définit, çà pourrait aider...
    Il doit ressembler à çà.
    Normalement console ou pas est passé via "base".

    - W
    Architectures Post-Modernes

  17. #17
    Membre à l'essai
    Homme Profil pro Etienne
    Inscrit en
    février 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : février 2012
    Messages : 39
    Points : 21
    Points
    21

    Par défaut

    Bonjour,

    En fait je ne refais pas un nouveau topic car la question reste la même :
    Comment afficher mes prints et mon GUI (de la même manière que lorsque j'execute un simple .py) avec un .exe

    Mais j'ai compris le setup.py suivant et résolu mon problème:

    Code :
    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
     
    # -*- coding: utf-8 -*-
     
    import sys, os
    import sys, string, os, time, shapefile, numpy
    import numpy as np
    import Tkinter
    import tkFileDialog
    import unicodedata
    from osgeo import gdal, ogr, osr, gdalconst
     
    from cx_Freeze import setup, Executable
     
    #############################################################################
    # preparation des options 
    path = sys.path.append(os.path.join("..", "..", "Modules"))
    includes = []
    excludes = []
    packages = ["Tkinter","numpy","string","time","shapefile","sys","os","tkFileDialog","unicodedata","osgeo","gdal","ogr","osr","gdalconst","StringIO","io","xlrd"]
     
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages
               }
     
    #############################################################################
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        base = None
    #    base = "Win32GUI"
     
     
    cible_1 = Executable(
        script = u"C:\Python26\mestexe.py",
        base = base,
        compress = True,
        icon = "icone.ico",
        )
     
     
    #############################################################################
    # creation du setup
    setup(
        name = "test",
        version = "1.0",
        description = "test",
        author = "author",
        options = {"build_exe": options},
        executables = [cible_1])
    Je n'avais pas compris qu'en mettant :
    J'aurais encore mon GUI et ma fenetre noire et mes print.

    Bon voilà j'ai résolu mon problème. Merci tout de même

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •