我创建了一个在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)
如果我仅使用该功能创建一个标签,则此方法效果很好。如果我使用此功能创建了多个标签,则每当更新标签时,该功能可能会破坏另一个标签,而不是被更新的标签。我该如何解决?
答案 0 :(得分:0)
这是因为您正在destroy
中Label
的最后一组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')