使用tkinter生成n个标签,其中n是可变的

问题描述 投票:0回答:2

我正在寻找一个顶级窗口,它上面有可控数量的标签小部件。在我的第一个窗口中,有一个缩放小部件,您可以使用它来选择顶级标签的数量。然后需要实时更新这些标签。我有生成顶级窗口的代码,以及使用After实用程序动态更新其上的一个标签。

我无法弄清楚如何生成一组变量标签,然后我可以在代码中更新。我的第一个想法是做这样的事情:

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

这个问题是它如何生成相同的标签n次,这意味着你不能独立地(或根本不)更新它们。这意味着我无法实现我的after参数,以使用实时数据更新它们。解决这个问题的正确方法是什么?

python tkinter label
2个回答
1
投票

这个问题是它如何生成相同的标签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()

1
投票

问题:如何生成一组变量标签,然后我可以在代码中更新

以下示例允许更新Labels小部件中的所有Toplevel

注意:如果你的Toplevel中还有其他小部件,请使用Frame作为Label并循环使用self.frame.children

要更新的数据必须是带有预定义dictkeys

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

© www.soinside.com 2019 - 2024. All rights reserved.