Использование tkinter для создания n меток, где n является переменной - PullRequest
0 голосов
/ 11 марта 2019

Я хочу реализовать окно верхнего уровня, в котором есть контролируемое количество виджетов меток. В моем первом окне есть виджет масштаба, который вы можете использовать для выбора количества меток на верхнем уровне. Эти ярлыки должны быть обновлены в режиме реального времени. У меня есть код для генерации окна верхнего уровня, а также для динамического обновления одной метки на нем с помощью утилиты After .

Я не могу понять, как создать переменный набор меток, которые я могу потом обновить в коде. Моя первая мысль сделать что-то вроде этого:

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

Проблема в том, как он генерирует одну и ту же метку n раз, и это означает, что вы не можете обновить их независимо (или вообще). Это означает, что я не могу реализовать свой аргумент после , чтобы обновить их данными в реальном времени. Как правильно решить эту проблему?

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Вопрос : как создать переменный набор меток, который я затем смогу обновить в коде

Следующий пример позволяет обновить все Labels в виджете Toplevel.

Примечание : Если у вас есть и другие виджеты в Toplevel, используйте Frame для Label и зацикливайте self.frame.children.

Данные для обновления должны быть dict с предопределенными keys.

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()

Протестировано с Python: 3,5

1 голос
/ 11 марта 2019

Проблема в том, как он генерирует одну и ту же метку n раз

Это неверно. Вы делаете создаете n разных меток, но на каждой итерации цикла вы перезаписываете ссылку на предыдущую метку. Поэтому, когда цикл заканчивается, у вас есть ссылка только на последнюю метку.

Что вы можете сделать, это сохранить различные метки в списке. Таким образом, вы можете получить к ним доступ по отдельности, используя их индекс:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...