Существует ли известная ошибка Win32 Tkinter в отношении отображения фотографий на холсте?
-
05-09-2019 - |
Вопрос
Я замечаю довольно странную ошибку с tkinter, и мне интересно, связано ли это с тем, что есть что-то в том, как python взаимодействует с tcl, по крайней мере, в Win32.
Здесь у меня есть супер простая программа, которая отображает GIF-изображение.Это работает идеально.
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
photo=PhotoImage(file=sys.argv[1])
canvas.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print canvas
print photo
mainloop( )
Теперь я немного изменяю программу, чтобы отредактировать объект canvas изнутри функции.На этот раз я просто получаю чистый холст.
# demo all basic canvas interfaces
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
def set_canvas(cv):
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
set_canvas(canvas)
mainloop( )
Единственное различие между ними заключается в том, что в одном из них объект canvas передается функции вместо того, чтобы использоваться напрямую.Оба оператора print возвращают идентичные результаты.Мне интересно, возможно ли какое-то нарушение в объектной модели на уровне tcl / python.
Есть какие-нибудь мысли, ребята?
Спасибо, /YGA
Решение
Сделайте это как быстрое решение, и я попытаюсь объяснить:
def set_canvas(cv):
global photo # here!
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
Фотоизображение должно иметь хотя бы одну ссылку на любой объект Python, в противном случае это собранный мусор.В моем решении я предлагаю сделать photo
быть именем уровня модуля, поэтому, когда функция завершится, все еще будет ссылка на объект PhotoImage.Возможно, вы предпочтете создать класс и сделать set_canvas
в метод и сохраните объект PhotoImage в качестве переменной экземпляра.