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

Tkinter Python Discussion :

changer le conenu du widget Label pendant exécution de fonction


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut changer le conenu du widget Label pendant exécution de fonction
    Salut à tous les pythoniein,

    Bon moi autant vous le dire tous de suite, je suis pas doué en prog, mais là j'ai pas le choix, faut que j'y arrive

    Bon voilà en m'inspirant du code trouvé ici pour télécharger l'arbo d'un dossier par FTP, j'ai pour but de le transformer en interface graphique, pour que l'utilisateur entre son login et mot de passe FTP et que ensuite celà télécharge automatiquement d'un point préci vers un autre.

    Celà fonctionne sauf que dans ma pitite téte de programmeur du dimanche, je veux que dans le widget Label s'affiche de façon dynamique le fichier en cours de copie.

    voici mon code enfin presque :

    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
    # -*- coding: Latin-1 -*-
     
    import os
    import ftplib
    from Tkinter import *
     
    global textv
    textv='coucou'
     
    def download():
        pathsrc='./programmation'
        pathdst='F:\\programmation\\python\\ftp\\telechargement'
        ftp=ftplib.FTP('')
        ftp.connect('192.168.1.2')
        user=str(entr1.get())
        passwd=str(entr2.get())
        ftp.login(user,passwd)
        lenpathsrc=len(pathsrc)
        def _download(pathsrc):
            l=ftp.nlst(pathsrc)
            for i in l:
                try:
                    ftp.size(i)
                    textv=i
                    progress.configure(text=textv)
                    ftp.retrbinary('RETR '+i, open(pathdst+os.sep+i[lenpathsrc:], 'wb').write)
                except:
                    try: os.makedirs(pathdst+os.sep+os.path.dirname(i[lenpathsrc:]))
                    except: pass
                    _download(i)
        _download(pathsrc)
        ftp.quit()
        progress.configure(text='Opération terminée...')
     
    #######################
    # interface graphique #
    #######################
     
    fen1=Tk()
    txt1=Label(fen1, text='    Login    :')
    txt2=Label(fen1, text='Mot de passe :')
    entr1=Entry(fen1)
    entr2=Entry(fen1)
    bout1=Button(fen1,text='telecharger',command=download)
    bout2=Button(fen1,text='Quiter',command=fen1.destroy)
    progress=Label(fen1,text=textv,width="50")
    txt1.grid(row=0,column=0)
    txt2.grid(row=1,column=0)
    entr1.grid(row=0,column=1)
    entr2.grid(row=1,column=1)
    bout1.grid(row=2,column=0)
    bout2.grid(row=2,column=1)
    progress.grid(row=3,column=0)
     
    fen1.mainloop()
    Le problème est le suivant si la ligne juste avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    progress.configure(text=textv)
    je rajoute

    print textv, celà fonctionne mon widget Label change de manière dynamique mais s'affiche aussi sous console ce qui est normal.

    Moi je veux juste que celà s'affiche dans le Widget, mais si j'enlève la commande print le Widget Label ne change pas sauf à la fin de la fonction pour affiché opération terminé.

    J'ai beau chercher je ne voix vraiment pas .

    Si quelqu'un peut m'aider merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    Je n'ai pas pu tester ton code, mais je pense savoir d'où vient le problème : tous les changements visuels effectués par Tkinter ne seront visibles à l'utilisateur uniquement quand la fonction prendra fin.
    Donc si toutes tes modifications du widget se font dans ta fonction download, tu ne verras rien.

    Mais il est possible de forcer la mise à jour de l'affichage, avec la méthode widget.update. Dans ton cas, ça se résumerait à un progress.update après le progress.configure.
    Exemple d'utilisation :
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    import time
     
    def start():
    	for i in xrange(10):
    		l.config(text="%d" % i)
    		l.update()      # force la mise à jour de l'affichage
    		time.sleep(0.2)
    	l.config(text="fin")
    root = Tk()
     
    l = Label(root, text="...")
    l.pack()
    Button(root, text="click", command=start).pack()
    root.mainloop()
    Enlève la ligne "l.update" et tu verras la différence.
    L'utilisation de la fonction time.sleep n'a pas d'utilité, mais sans elle les affichages successifs seraient tellement rapides qu'on ne verrait strictement rien à l'écran.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup sa marche nikel bien

    J'avais bien isolé le problème mais je ne connaissais pas la commande .update.

    Sinon j'ai un deuxième problème que je n'arrive pas résoudre certainement lié à une histoire de codage, j'en est essayé plusieurs (1252, 850, latin-1 etc ....) mais rien à faire sa change rien.

    Enfin le problème est par exemple un fichier nomé sur le serveur FTP tété.txt se transforme à l'arrivé en t@~t@~.txt

    Une idée ?

    Sinon voilà mon code modifé avec tes conseils, on sait jamais sa peut servir pour d'autres...

    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
    # -*- coding: Latin-1 -*-
     
    import os
    import ftplib
    from Tkinter import *
    import time
     
    global textv
     
     
    def download():
        pathsrc='./programmation'
        pathdst='F:\\programmation\\python\\ftp\\telechargement'
        ftp=ftplib.FTP('')
        ftp.connect('192.168.1.2')
        user=str(entr1.get())
        passwd=str(entr2.get())
        ftp.login(user,passwd)
        lenpathsrc=len(pathsrc)
        def _download(pathsrc):
            l=ftp.nlst(pathsrc)
            for i in l:
                try:
                    ftp.size(i)
                    #textv=i
                    progress.config(text=i)
                    progress.update()
                    ftp.retrbinary('RETR '+i, open(pathdst+os.sep+i[lenpathsrc:], 'wb').write)
                    time.sleep(0.2)
                except:
                    try: os.makedirs(pathdst+os.sep+os.path.dirname(i[lenpathsrc:]))
                    except: pass
                    _download(i)
        _download(pathsrc)
        ftp.quit()
        progress.configure(text='Opération terminée...')
     
    #######################
    # interface graphique #
    #######################
     
    fen1=Tk()
    txt1=Label(fen1, text='    Login    :')
    txt2=Label(fen1, text='Mot de passe :')
    entr1=Entry(fen1)
    entr2=Entry(fen1)
    bout1=Button(fen1,text='telecharger',command=download)
    bout2=Button(fen1,text='Quiter',command=fen1.destroy)
    progress=Label(fen1,text="...",width="50")
    txt1.grid(row=0,column=0)
    txt2.grid(row=1,column=0)
    entr1.grid(row=0,column=1)
    entr2.grid(row=1,column=1)
    bout1.grid(row=2,column=0)
    bout2.grid(row=2,column=1)
    progress.grid(row=3,column=0)
     
    fen1.mainloop()

    Encore merci

Discussions similaires

  1. Changer le Nom d'un bouton pendant une exécution
    Par fmr130 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/01/2009, 14h37
  2. Réponses: 3
    Dernier message: 30/10/2008, 14h15
  3. changer le style d'un label
    Par chourmo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/12/2005, 15h42
  4. [MFC] Changer la couleur d'un label
    Par Gulix dans le forum MFC
    Réponses: 4
    Dernier message: 11/10/2005, 13h54
  5. Réponses: 10
    Dernier message: 04/04/2005, 21h52

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