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 :

Mise a jour de la fenetre avec .configure()


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut Mise a jour de la fenetre avec .configure()
    Bonjour,
    Je souhaite mettre a jour un element avec du texte dans la fenetre Tkinter avec l'option .configure(text='...'), seulement ceci marche tres bien tant que je veux la changer une fois par click sur le bouton "Valider" mais ca ne marche pas lorsque le bouton Valider lance une boucle et qu'a chaque itération de la boucle la phrase est censé changer
    en gros voici mon code en simplifié
    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
     
     
    from tkinter import *
    def analyserfenetre():
        i=1
        while i<=500 :
            print('i=',i,sep='')
            phrase=('i=',i)
            zoneDeTexte.configure(text=phrase)
            i=i+1
     
     
     
    fenetre=Tk()
     
    boutton1=Button(fenetre,text='       Valider       ',command=analyserfenetre)
    zoneDeTexte=Label(fenetre,text='''En attente de validation...''')
     
     
    boutton1.grid(row=1,column=1)
    zoneDeTexte.grid(row=6,columnspan=2,rowspan=2)
     
    fenetre.mainloop()
    ici, lorsqu'on appuie sur valider la phrase "en attente de validation..." devrait devenir "i=1" puis "i=2" jusqu'a "i=500"
    seulement à la place, ma fenetre Tkinter plante (en mode "ne repond pas") jusqu'a la fin du script, et seulement un efois arrivé à 500 la fenetre refonctionne et alors la phrase devient bien "i=500"
    A savoir que j esuis sous Windows Vista, que cela fait pareil sous Seven, en revanche sous Mac OS la fenetre continue de fonctionner (pas de bug) mais par contre elle ne met pas a jour la phrase, avant que le script soit terminé

    en revanche lorsque la fonction ne possede pas de boucle,cliquer sur valider plusieurs fois de suite change bien la phrase et prend toutes les valeurs de "i"

    Ducoup est ce que vous savez comment mettre a jour cette phrase dans la boucle s'il vous plait?

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Le while bloque effectivement l'interpréteur tant que l'on n'en est pas sorti.
    Pour ce genre de manipulation graphique utilisez plutôt widget.after(ms, fn)

    Dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    i = 1
     
    def analyserfenetre():
        global i
        print('i=', i, sep='')
        zoneDeTexte.configure(text=('i=', i))
        i += 1
        if i <= 500:
            fenetre.after(1, analyserfenetre)
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Loupsio Voir le message
    Bonjour,
    Je souhaite mettre a jour un element avec du texte dans la fenetre Tkinter avec l'option .configure(text='...'), seulement ceci marche tres bien tant que je veux la changer une fois par click sur le bouton "Valider" mais ca ne marche pas lorsque le bouton Valider lance une boucle et qu'a chaque itération de la boucle la phrase est censé changer
    en gros voici mon code en simplifié
    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
     
     
    from tkinter import *
    def analyserfenetre():
        i=1
        while i<=500 :
            print('i=',i,sep='')
            phrase=('i=',i)
            zoneDeTexte.configure(text=phrase)
            i=i+1
     
     
     
    fenetre=Tk()
     
    boutton1=Button(fenetre,text='       Valider       ',command=analyserfenetre)
    zoneDeTexte=Label(fenetre,text='''En attente de validation...''')
     
     
    boutton1.grid(row=1,column=1)
    zoneDeTexte.grid(row=6,columnspan=2,rowspan=2)
     
    fenetre.mainloop()
    ici, lorsqu'on appuie sur valider la phrase "en attente de validation..." devrait devenir "i=1" puis "i=2" jusqu'a "i=500"
    seulement à la place, ma fenetre Tkinter plante (en mode "ne repond pas") jusqu'a la fin du script, et seulement un efois arrivé à 500 la fenetre refonctionne et alors la phrase devient bien "i=500"
    A savoir que j esuis sous Windows Vista, que cela fait pareil sous Seven, en revanche sous Mac OS la fenetre continue de fonctionner (pas de bug) mais par contre elle ne met pas a jour la phrase, avant que le script soit terminé

    en revanche lorsque la fonction ne possede pas de boucle,cliquer sur valider plusieurs fois de suite change bien la phrase et prend toutes les valeurs de "i"

    Ducoup est ce que vous savez comment mettre a jour cette phrase dans la boucle s'il vous plait?
    Bonjour,

    Tkinter a tendance à différer un certain nombre de tâches, dont la mise à jour de l'affichage de ses widgets.

    Si vous voulez avoir l'affichage d'un widget particulier à jour à un moment donné, il faut le demander explicitement avec widget.update_idletasks() comme suit :

    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    import time
     
    # actions
     
    def analyserfenetre():
     
        for i in range(1, 501):
     
            print("i=", i, sep="")
     
            zoneDeTexte.configure(text="i={}".format(i))
     
            zoneDeTexte.update_idletasks()
     
            # si ça va trop vite :
     
            time.sleep(0.05)
     
        # end for
     
    # end def
     
     
    # main window
     
    fenetre = Tk()
     
    # components
     
    boutton1 = Button(
     
        fenetre, text="Valider", command=analyserfenetre,
    )
     
    zoneDeTexte = Label(
     
        fenetre, text="En attente de validation...",
    )
     
    # layout
     
    boutton1.grid(row=1, column=1, ipadx=50)
     
    zoneDeTexte.grid(row=6, columnspan=2, rowspan=2)
     
    # run app
     
    fenetre.mainloop()
    @+.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Meci beacuoup,
    ca fonctionne nickel, par contre j'aurais une derniere question,
    la phrase a mettre a jour c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    phrase=('Analyse du score numéro ',(i+1),'/',len(sequences1))
    phrase=str(phrase)
            zoneDeTexte.configure(text=phrase.format(phrase))
            zoneDeTexte.update_idletasks()
    quand je met avec ca s'affiche correctement
    mais la vraie phrase, bizarrement il laisse les apostrophes et virgules au lieu de me faire une phrase normale,
    il y a un moyens de l'afficher comme dans le terminal, c'est a dire:
    Analyse du score numéro 8/100
    au lieu de :
    'Analyse du score numéro ',8,'/',100

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Loupsio Voir le message
    Meci beacuoup,
    ca fonctionne nickel, par contre j'aurais une derniere question,
    la phrase a mettre a jour c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    phrase=('Analyse du score numéro ',(i+1),'/',len(sequences1))
    phrase=str(phrase)
            zoneDeTexte.configure(text=phrase.format(phrase))
            zoneDeTexte.update_idletasks()
    quand je met avec ca s'affiche correctement
    mais la vraie phrase, bizarrement il laisse les apostrophes et virgules au lieu de me faire une phrase normale,
    il y a un moyens de l'afficher comme dans le terminal, c'est a dire:
    Analyse du score numéro 8/100
    au lieu de :
    'Analyse du score numéro ',8,'/',100
    Svp, évitez les notations exotiques du genre (i, 1) ou ('Analyse du score numéro ',(i+1),'/',len(sequences1)) pour formater une chaîne de caractères alors que vous produisez des tuples (e.g. x = (a, b, c)), en réalité.

    Doc Python sur les tuples :

    https://docs.python.org/3.3/library/...es.html#tuples

    Travaillez directement avec votre chaîne de caractères, à laquelle vous appliquez la méthode str.format().

    D'écrire phrase.format(phrase) démontre que vous n'avez pas lu (pas compris?) la doc officielle de Python (et il faut toujours lire/comprendre la doc avant de questionner, bien sûr) :

    https://docs.python.org/3.3/library/...tml#str.format

    ainsi que :

    https://docs.python.org/3.3/library/...#formatstrings

    autrement dit, il vous suffisait d'écrire (exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    zoneDeTexte.configure(text="Analyse du score numéro {index}/{total}".format(index=(i+1), total=len(sequences1)))
    zoneDeTexte.update_idletasks()
    Vous devriez vous plonger dans l'étude attentive de la doc officielle de Python :

    https://docs.python.org/3.3/library/index.html

    C'est une "perte de temps" qui vous en fera gagner beaucoup (du temps et de l'argent), au final.

    Merci de cliquer sur 'Résolu' si vos problèmes ont trouvé réponse.

    @+.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    D'acc, je vais voir ca
    c'est vrai que j'ai tendance a choisir la facilité que représentent les tuples :s

    merci beaucoup,

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

Discussions similaires

  1. [PDO] mise a jour de deux tables avec PDO
    Par Invité dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/10/2011, 01h44
  2. [MySQL] mise a jour sur une table avec MD5
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/11/2010, 11h58
  3. MISE A JOUR de grosses tables avec index
    Par soph35 dans le forum SAS Base
    Réponses: 6
    Dernier message: 26/03/2010, 11h03
  4. mise a jour des données impossible avec soapconnection
    Par amireve dans le forum Web & réseau
    Réponses: 10
    Dernier message: 04/02/2010, 19h28
  5. Mise a jour d'un inputText avec JSF
    Par rabebIF5 dans le forum JSF
    Réponses: 3
    Dernier message: 20/05/2009, 17h12

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