Очистка предыдущей метки в tkinter

avatar
Kaepora Gaebora
8 августа 2021 в 20:35
39
1
0

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

def getPrice():

    console = variable.get()
    game = gameSearch.get()

    with open('price-guide.csv') as csv_file:
        csv_reader = csv.reader(csv_file)

        for row in csv_reader:
            if row[1] == console and game.lower() in row[2].lower():
                price = f"""Game Title: {row[2].upper()}
Loose: {row[3]}
CIB: {row[4]}
New: {row[5]}
"""
                priceLabel = Label(root, text=price)
                priceLabel.pack()
    csv_file.close()

В настоящее время программа работает отлично, я могу выбрать консоль (Playstation 2), найти игру (God of War), и она вернет серию меток с ценовой информацией "priceLabel". Но если я выполню новый поиск, он просто добавит в конец предыдущих результатов поиска. Я пробовал искать другие решения, но, поскольку я начал изучать tkinter только сегодня, я не уверен, что наткнулся на решение, даже не зная об этом.

Даже возможность «обновить» программу без необходимости закрывать и запускать ее снова будет работать для моих нужд.

Источник
jasonharper
8 августа 2021 в 20:41
0

Вам нужно будет сохранить ссылки на все ваши ярлыки (возможно, в виде списка), чтобы вы могли позже вызвать .destroy() для каждого из них, чтобы избавиться от него. Другой подход заключается в добавлении меток к фрейму, а не непосредственно к корневому окну; затем вы можете вызвать .destroy() для фрейма, чтобы сразу избавиться от всех меток (а затем создать новый фрейм для следующей партии меток).

martineau
8 августа 2021 в 21:14
0

Вы можете изменить параметры любого существующего виджета, вызвав его метод config(). Для этого вам нужно будет сохранить их все в контейнере, таком как список или словарь, чтобы вы могли обращаться к ним снова по мере необходимости.

Ответы (1)

avatar
maanas
8 августа 2021 в 20:55
0

Кажется, вы упаковываете новые виджеты ярлыков внизу. Каждый раз, когда вы создаете новый экземпляр Label и вызываете pack(), вы упаковываете новый виджет в графический интерфейс.

Одним из решений может быть использование списка меток, уничтожение каждой из них и повторное заполнение результатов:


    console = variable.get()
    game = gameSearch.get()

    priceLabels = []
    with open('price-guide.csv') as csv_file:
        csv_reader = csv.reader(csv_file)
        # clear the labels
        for priceLabel in priceLabels:
            priceLabel.destroy()

        for row in csv_reader:
            if row[1] == console and game.lower() in row[2].lower():
                price = f"""Game Title: {row[2].upper()}
Loose: {row[3]}
CIB: {row[4]}
New: {row[5]}
"""
                priceLabel = Label(root, text=price)
                # add to list to clear in the future
                priceLabels.append(priceLabel)
                priceLabel.pack()
    csv_file.close()```