我正在寻找一个顶级窗口,它上面有可控数量的标签小部件。在我的第一个窗口中,有一个缩放小部件,您可以使用它来选择顶级标签的数量。然后需要实时更新这些标签。我有生成顶级窗口的代码,以及使用After实用程序动态更新其上的一个标签。
我无法弄清楚如何生成一组变量标签,然后我可以在代码中更新。我的第一个想法是做这样的事情:
for i in range(n):
label = Label(top_level, text = "Text")
label.pack()
这个问题是它如何生成相同的标签n次,这意味着你不能独立地(或根本不)更新它们。这意味着我无法实现我的after参数,以使用实时数据更新它们。解决这个问题的正确方法是什么?
这个问题是它如何生成相同的标签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()
问题:如何生成一组变量标签,然后我可以在代码中更新
以下示例允许更新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