Как создать функцию метки, которая обновляет каждую созданную метку? - PullRequest
0 голосов
/ 12 июля 2020

Я создал функцию, которая создает метки в tkinter. Цель моей функции - создавать метки, которые обновляются при отображении новых вычисленных значений. У меня есть следующий код:

def display_values(self, attribute, type, r, c, cs):
    try:
        if self.display_label:
            self.display_label.destroy()
    except AttributeError:
        lambda *args: None
    self.display_label = tk.Label(self.parent, text=str(attribute) + " (" + type + ")")
    self.display_label.grid(row=r, column=c, columnspan=cs, sticky=tk.W)

Это отлично работает, если я создаю только одну метку с помощью функции. Если я создаю несколько меток с помощью этой функции, всякий раз, когда метка обновляется, функция может уничтожить другую метку, а не метку, которая была обновлена. Как бы это исправить?

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Ваша проблема в том, что вы уничтожаете и воссоздаете ярлыки, не обновляя их. Создав метку, вы можете легко обновить ее, не разрушая, используя метод конфигурации.

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')
0 голосов
/ 13 июля 2020

Это потому, что вы destroy используете последний набор Label в self.display_label, вам нужен способ различать Labels, которые вы создаете, например, сохраняя их в dict ionary, а также иметь другой метод обновления любых произвольных 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...