Есть ли известная ошибка Win32 Tkinter при отображении фотографий на холсте? - PullRequest
3 голосов
/ 23 февраля 2009

Я замечаю довольно странную ошибку с tkinter, и мне интересно, если это потому, что есть что-то в том, как питон взаимодействует с 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 передается функции, а не используется напрямую. Оба оператора печати возвращают идентичные результаты. Мне интересно, возможно, есть какая-то поломка в объектной модели на уровне tcl / python.

Есть мысли, ребята?

Спасибо, / YGA

1 Ответ

6 голосов
/ 24 февраля 2009

Сделайте это как быстрое решение, и я постараюсь объяснить:

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

PhotoImage должен иметь хотя бы одну ссылку из любого объекта Python, в противном случае это сборщик мусора. В моем решении я предлагаю сделать photo именем уровня модуля, поэтому, когда функция завершится, все равно будет ссылка на объект PhotoImage. Вы можете предпочесть создать класс и сделать метод set_canvas и сохранить объект PhotoImage в качестве переменной экземпляра.

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