Boucle for pour changer un label avec textvariable

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. Contributeur

    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()
    1. Contributeur

      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()
    2. Contributeur
      @yg_be

      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.

  2. 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.