如何创建一个标签函数来更新每个创建的标签?

时间:2020-07-12 19:48:47

标签: python function tkinter

我创建了一个在tkinter中创建标签的函数。我函数的目标是创建标签,以在显示新的计算值时对其进行更新。我有以下代码:

None of the following substitutions
receiver: Iterable<KProperty1<Book, String>>  arguments: ((Any, KProperty1<Book, String>) -> Any)
receiver: Iterable<KProperty1<Book, String>>  arguments: ((KProperty1<Book, String>, KProperty1<Book, String>) -> KProperty1<Book, String>)
can be applied to
receiver: List<KProperty1<Book, String>>  arguments: ((KProperty1<Book, String>, KProperty1<Book, String>) -> String)

如果我仅使用该功能创建一个标签,则此方法效果很好。如果我使用此功能创建了多个标签,则每当更新标签时,该功能可能会破坏另一个标签,而不是被更新的标签。我该如何解决?

2 个答案:

答案 0 :(得分:0)

这是因为您正在destroyLabel的最后一组self.display_label,因此需要一种区分创建的Labels的方法,例如将它们保存在dict起初,并且还有一种更新任意Label的方法。

def create_labels(self, attribute, type, r, c, cs, Key):
    try:
        self.Labels
    except:
        self.Labels = dict()
    self.Labels[Key] = tk.Label(self.parent, text = '{} ({})'.format(str(attribute),type))
    self.Labels[Key].grid(row=r, column=c, columnspan=cs, sticky=tk.W)

def update_labels(self, Key, Value):
    self.Labels[Key]['text'] = '{}'.format(Value)

答案 1 :(得分:0)

您的问题是您要破坏和重新创建标签,而不更新它们。 创建标签后,您可以轻松地对其进行更新,而无需使用其config方法破坏它。

my_label = Label(parent, text='Hello')    #<-- Create a label

my_label.config(text='Bye')       #<-- update label

因此,在您的代码中,您可以执行以下操作:

from Tkinter import *

# Your updating function

def update_labels(labels, new_info):
    for l in labels:
        l.config(text=new_info)


from functools import partial   #<-- use partial to pass arguments from button event

tk = Tk()

# Create my label
my_label = Label(text='Hello')
my_label.pack()

# To update my label
my_label.config(text='bye')

# So you could make a list of labels, and then update that list

labels = []
for l in range(10):
    lbl = Label(text=l)
    lbl.pack()
    labels.append(lbl)


# A button that updates all labels, example

b = Button(text='Update', command=partial(update_labels, labels, 'hi'))
b.pack()


mainloop()

现在,您显然希望使用不同的数据更新每个标签。 为此,将每个标签添加到具有不同键名的字典中

labels = {}
for l in range(10):
    labels[l] = Label(text=l)
    labels[l].pack()

创建您的更新功能

def update_label(label, new_info):
    label.config(new_info)

然后使用标签键名称从标签字典中访问它

label = labels[2]

然后调用您的update_label函数

update_label(label, 'new info here')
相关问题