PIL и Tkinter для программного обеспечения для рисования

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

window = Tk(className ='Window')
image = Image.new('RGB', (800,600),"#ffffff")

image_tk = PhotoImage(image)

canvas = Canvas(window,width = 800, height = 600)
canvas.create_image(400 ,300,image = image_tk)
canvas.pack()

draw = ImageDraw.Draw(image)


def mouseclick(event):
    draw.point((event.x,event.y),fill=128)
    print event.x,event.y

canvas.bind("<Button-1>", mouseclick)
mainloop()

Что следует добавить? Может быть, есть другие лучшие модули для этого?


person user1513100    schedule 21.09.2012    source источник


Ответы (1)


Это будет дорого, вам нужно создать новый PhotoImage, чтобы отразить ваши изменения. В качестве альтернативы рассмотрите возможность рисования на холсте без использования изображения. Если затем вам нужно сохранить то, что было нарисовано на холсте, у вас есть простой вариант экспортировать его в PostScript или более сложный вариант — сохранить то, что было нарисовано, и воспроизвести его.

На данный момент вот пример, который настраивает ваш код, чтобы он работал так, как вы задумали (хотя я рекомендую вариант рисования на холсте):

import Tkinter
from PIL import Image, ImageDraw, ImageTk

def paint_img(event, canvas):
    x, y = event.x, event.y
    image_draw.ellipse((x-5, y-5, x+5, y+5), fill='black')
    canvas._image_tk = ImageTk.PhotoImage(image)
    canvas.itemconfigure(canvas._image_id, image=canvas._image_tk)

root = Tkinter.Tk()

width, height = 800, 600
canvas = Tkinter.Canvas(width=width, height=height)
canvas.pack()

image = Image.new('RGB', (width, height), '#cdcdcd')
image_draw = ImageDraw.Draw(image)
canvas._image_tk = ImageTk.PhotoImage(image)
canvas._image_id = canvas.create_image(0, 0, image=canvas._image_tk, anchor='nw')
canvas.tag_bind(canvas._image_id, "<Button-1>", lambda e: paint_img(e, canvas))

root.mainloop()
person mmgp    schedule 25.01.2013