Boucle for pour changer un label avec textvariable

xunil2003 Messages postés 766 Date d'inscription   Statut Membre Dernière intervention   -  
 jugor -

Bonjour,

Je voudrais savoir comment faire une boucle for pour changer le texte d'un label depuis une liste.
 

j'ai fait plein d'essai aucun ne fonctionne .

Pouvez vous m'aider ?

Merci d'avance pour vos avis et conseils.

#!/usr/bin/python3
# -*- coding:utf-8 -*-

# python3 /home/laurent/Langages/python/3.4.3/videos2/changer-texte-d-un-label-03.py

from tkinter import *
import tkinter as tk
import time

 
liste_videos_pioche = ['xxxxxxxxxxx', 'gggggggggg', 'kkkkkkkkk', 'pppppppppp'] #, 'oooooooooooooooo', 'pppppppppppp', 'rrrrrrrrrrrr', 'sssssssssssss', 'mmmmmmmmmmmm', 'vvvvvvvvvvvvvvv']
nro1=0

def plus2():    
    global nro2
    nro2+=1
    if nro2==len(liste_videos_pioche):
        nro2=0
    entree2['text']=liste_videos_pioche[nro2]
    print ("liste_videos_pioche[nro2] : ",liste_videos_pioche[nro2])
    print ("nro2 : ",nro2)
    
def test():
    plus2()
    
    nb_liste = len(liste_videos_pioche)
    for i in range(0, nb_liste):
        print ("i : ",i)
        nro2=i
        plus2()
        time.sleep(2)
    
 
root=Tk()
    
plus2()
 
root.mainloop()


Linux / Firefox 122.0

3 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour,

    Il est défini ou ton label ?

    0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    un exemple:

    import tkinter 
    liste_videos_pioche = ['xxxxxxxxxxx', 'gggggggggg', 'kkkkkkkkk', 'pppppppppp'] #, 'oooooooooooooooo', 'pppppppppppp', 'rrrrrrrrrrrr', 'sssssssssssss', 'mmmmmmmmmmmm', 'vvvvvvvvvvvvvvv']
    def plus2():    
        global nro2,entree2    
        if nro2<len(liste_videos_pioche):
            entree2['text']=liste_videos_pioche[nro2]
            nro2+=1
            entree2.after(2000, plus2)
    root=tkinter.Tk()
    entree2=tkinter.Label(root)
    entree2.pack()
    nro2=0
    plus2()
    root.mainloop()
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      un autre exemple plus propre, sans global:

      import tkinter 
      liste_videos_pioche = ['xxxxxxxxxxx', 'gggggggggg', 'kkkkkkkkk', 'pppppppppp' ,
      'oooooooooooooooo', 'pppppppppppp', 'rrrrrrrrrrrr', 'sssssssssssss', 'mmmmmmmmmmmm',
      'vvvvvvvvvvvvvvv']
      def plus2(w):    
          if w.nro2==len(liste_videos_pioche):
              w.nro2=0
          w['text']=liste_videos_pioche[w.nro2]
          w.nro2+=1
          w.after(1500, lambda:plus2(w))
      root=tkinter.Tk()
      entree2=tkinter.Label(root)
      entree2.pack()
      entree2.nro2=0
      plus2(entree2)
      root.mainloop()
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Il est possible d'utiliser des sleep(), mais cela bloquerait tout ce que tu voudrais faire de plus dans tkinter:

        import tkinter
        import time
        liste_videos_pioche = ['xxxxxxxxxxx', 'gggggggggg', 'kkkkkkkkk', 'pppppppppp' ,
        'oooooooooooooooo', 'pppppppppppp', 'rrrrrrrrrrrr', 'sssssssssssss', 'mmmmmmmmmmmm',
        'vvvvvvvvvvvvvvv']
        def plus3(w):    
            while True:
                if w.nro2==len(liste_videos_pioche):
                    w.nro2=0
                w['text']=liste_videos_pioche[w.nro2]
                w.update()
                w.nro2+=1
                time.sleep(2)
        root=tkinter.Tk()
        entree2=tkinter.Label(root)
        entree2.pack()
        entree2.nro2=0
        entree2.after(100,lambda:plus3(entree2))
        root.mainloop()

        Ici, comme tu ne fais rien d'autre, cela peut fonctionner.

        0
  3. jugor
     

    Bonjour, on peut réduire cela en :

    import tkinter as tk
    
    
    def change_text(widget, list_values, delay):
        ms = int(delay * 1000)
        for i, text in enumerate(list_values):
            widget.after(ms * i, widget.config, {'text':list_values[i]})
    
    liste_videos_pioche = (
        'xxxxxxxxxxx', 'gggggggggg', 'kkkkkkkkk',
        'pppppppppp', 'oooooooooooooooo', 'pppppppppppp',
        'rrrrrrrrrrrr', 'sssssssssssss', 'mmmmmmmmmmmm',
        'vvvvvvvvvvvvvvv',
    )
    
    root = tk.Tk()
    label = tk.Label(root, text='', width=4 + max(n for n in map(len, liste_videos_pioche)))
    label.grid()
    
    change_text(label, liste_videos_pioche, .5)
    
    root.mainloop()

    La méthode after pouvant accepter des paramètres à passer à la fonction.

    0