Существует ли известная ошибка Win32 Tkinter в отношении отображения фотографий на холсте?

StackOverflow https://stackoverflow.com/questions/576843

Вопрос

Я замечаю довольно странную ошибку с 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 в качестве переменной экземпляра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top