Обновление изображения метки в tKinter работает, но я не уверен, почему? - PullRequest
0 голосов
/ 11 марта 2019

Хорошо, у меня есть проект в tKinter, который включает в себя ярлык с изображением и поле ввода. Что мне нужно сделать, это то, что изображение меняется в зависимости от текста в поле ввода. Вот соответствующий код:

from tkinter import *


def go():
    art = PhotoImage(file=str(entry.get() + ".png"))
    portrait = Label(root, image=art)
    portrait_1.grid(row=0, column=0)
    print(z1)


root = Tk()
root.title("Window Title")

art = PhotoImage(file="image1_.png")
portrait = Label(root, image=art)
portrait1.grid(row=0, column=0)

entry = Entry(root)
entry.grid(row=1, column=0)

goButt = Button(root, text="Go", command=go)
goButt.grid(row=1, column=1)

root.mainloop()

Я пробовал много разных способов заставить это работать (с обновлением изображения этикетки), но это единственный, который был успешным.

Вы можете заметить команду print(z1) в функции go(). z1 не является определенной переменной и не используется где-либо еще в коде, но без нее нажатие кнопки Go удаляет старое изображение, но оставляет метку пустой (т.е. новое изображение не загружается). Удаление этого бита кода или определение z1 любым способом (например, z1 = 1) делает то же самое.

Пока что наличие print(z1) никоим образом не влияет на проект, но его присутствие там немного раздражает. Мне было интересно, может ли кто-нибудь объяснить , почему проект, кажется, работает только с этим битом кода (и почему он работает только, если он не определен), и есть ли способ избавиться от него безопасно.

1 Ответ

0 голосов
/ 12 марта 2019

Существует некоторая путаница в коде, который вы разместили, с именем виджета метки portrait, portrait1 и portrait_1. После исправления это выглядит так:

Функция go() создает новую метку (портрет). Это не тот ярлык, который вы создали ранее, а новый, который существует только внутри функции go(). Затем вы помещаете изображение в ярлык и помещаете его в корневое окно. Имя изображения существует только внутри функции go(), что означает, что по окончании функции это будет сборщик мусора.

Строка print(z1) останавливает программу до завершения функции и, таким образом, сохраняет ссылку на изображение. Без строки print(z1) функция выйдет, ссылка на изображение будет собрана, и метка больше не сможет найти изображение.

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

from tkinter import *

def go():
    new = PhotoImage(file=str(entry.get() + ".png")) # Create new image
    portrait.config(image=new)  # Update label with new image
    portrait.image = new        # Save reference to the image

root = Tk()
root.title("Window Title")

art = PhotoImage(file="image1_.png")
portrait = Label(root, image=art)
portrait.grid(row=0, column=0)

entry = Entry(root)
entry.grid(row=1, column=0)

goButt = Button(root, text="Go", command=go)
goButt.grid(row=1, column=1)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...