Использование PIL или подушки для рисования изображения и его отображения с помощью TKinter

Я хочу нарисовать изображение программно. По сути, я говорю о настройке каждого отдельного пикселя как карты изображения, и я хотел бы сделать это с помощью PIL/подушки. Затем я хотел бы отобразить его на экране. Графический интерфейс основан на TKinter.

root = Tk()
root.wm_title("Lands - A world generator")
root.resizable(0,0)

prepare_menu()

canvas = Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()

root.mainloop()

prepare_menu устанавливает меню и связывает одну запись с обработчиком событий, который вызывает функцию show_elevation_map следующим образом:

def show_elevation_map(p, width, height):    
    hm = platec.get_heightmap(p)
    img = PIL.Image.new('RGBA', (width, height))
    pixels = img.load()
    for y in range(0, height):
        for x in range(0, width):            
            pixels[x, y] = (255, 0, 0, 255)
    pi = ImageTk.PhotoImage(img)
    sprite = canvas.create_image(100, 100, image=pi)
    canvas.update()

Я пробовал так, но я ничего не вижу на экране, в то время как я ожидал увидеть все красным. Что я здесь делаю неправильно?

Спасибо.


person Federico Tomassetti    schedule 10.01.2015    source источник
comment
Так как же выглядит prepare_menu()? Есть ошибки?   -  person Mr. Concolato    schedule 10.01.2015
comment
Ошибка не возвращается. Я видел, что если я намеренно выбрасываю исключение, изображение отображается... prepare_menu довольно простое (слишком длинное, чтобы публиковать в качестве комментария)   -  person Federico Tomassetti    schedule 10.01.2015


Ответы (1)


Ваше изображение, скорее всего, собирает мусор. Вам необходимо сохранить постоянную ссылку на изображение.

person Bryan Oakley    schedule 10.01.2015