Je cherche à implémenter une fenêtre de niveau supérieur qui contient un nombre contrôlable de widgets d'étiquettes. Dans ma première fenêtre, il y a un widget d'échelle que vous pouvez utiliser pour sélectionner le nombre d'étiquettes au niveau supérieur. Ces étiquettes doivent ensuite être mises à jour en temps réel. J'ai du code pour générer la fenêtre de niveau supérieur, ainsi que pour mettre à jour dynamiquement une étiquette dessus à l'aide de l'utilitaire Après .

Je ne peux pas comprendre comment produire un ensemble variable d'étiquettes que je pourrai ensuite mettre à jour plus tard dans le code. Ma première pensée est de faire quelque chose comme ça:

for i in range(n):
  label = Label(top_level, text = "Text")
  label.pack()

Le problème est de savoir comment il génère la même étiquette n fois et cela signifie que vous ne pouvez pas les mettre à jour indépendamment (ou pas du tout). Cela signifie que je ne peux pas implémenter mon argument après pour les mettre à jour avec des données en temps réel. Quelle est la bonne façon d'aborder ce problème?

0
SilverNitrateIon 11 mars 2019 à 18:04

2 réponses

Meilleure réponse

Le problème est de savoir comment il génère la même étiquette n fois

Ceci est une erreur. Vous créez n étiquettes différentes, mais à chaque itération de la boucle, vous écrasez la référence à l'étiquette précédente. Par conséquent, lorsque la boucle se termine, vous disposez d'une référence à la dernière étiquette uniquement.

Ce que vous pouvez faire, c'est d'enregistrer les différentes étiquettes dans une liste. De cette façon, vous pouvez y accéder individuellement en utilisant leur index:

from tkinter import *

top_level = Tk()

n = 5
label_list = []

for i in range(n):
    label_list.append(Label(top_level, text = "Text"))
    label_list[i].pack()

for i in range(n):
    label_list[i].config(text="Text {}".format(i))

top_level.mainloop()
1
fhdrsdg 11 mars 2019 à 15:57

Question : comment produire un ensemble variable d'étiquettes que je peux ensuite mettre à jour plus tard dans le code

L'exemple suivant permet de mettre à jour tous Labels dans un widget Toplevel.

Remarque : Si vous avez également d'autres widgets dans votre Toplevel, utilisez un Frame pour les Label et bouclez le self.frame.children.

Les données à mettre à jour doivent être un dict avec keys prédéfini.

import tkinter as tk
from collections import OrderedDict

class Toplevel(tk.Toplevel):
    def __init__(self, parent, label_dict):
        super().__init__(parent)

        for key, text in label_dict.items():
            label = tk.Label(self, text=text)
            label.key = key
            label.pack()

    def update_labels(self, data):
        children = self.children
        for c in children:
            label = children[c]
            label.configure(text=data[label.key])

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.menubar = tk.Menu()
        self.menubar.add_command(label='Update', command=self.update)

        self.labels = OrderedDict({'label_1':'Label 1', 'label_2':'Label 2', 'label_3':'Label 3'})
        self.top = Toplevel(self, self.labels)


    def update(self):
        for key, text in self.labels.items():
            self.labels[key] = 'Updated {}'.format(text)

        self.top.update_labels(self.labels)

if __name__ == "__main__":
    App().mainloop()

Testé avec Python: 3.5

1
stovfl 11 mars 2019 à 16:02