Boucle for pour changer un label avec textvariable

xunil2003 Messages postés 765 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 5 septembre 2024 - Modifié par xunil2003 le 4/02/2024 à 15:05
 jugor - 5 févr. 2024 à 08:43

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

A voir également:

3 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
4 févr. 2024 à 18:40

Bonjour,

Il est défini ou ton label ?

0
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 Ambassadeur 1 533
4 févr. 2024 à 19:02

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
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533
4 févr. 2024 à 19:13

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
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533 > yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024
5 févr. 2024 à 07:30

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

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