1

I am trying to write a code that would place a point/line/whatever at the mouse coordinates, aka Paint. I am using PIL and Tkinter. The problem is I can't understand how to realise canvas update.

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()

What should be added? Maybe there are other better modules for doing it ?

4

1 に答える 1

1

それは高くつくでしょう、あなたはPhotoImageあなたの修正を反映するために新しいものを作成する必要があります。または、画像を使用せずにキャンバスに描画することを検討してください。次に、キャンバスに描画されたものを保存する必要がある場合は、それをポストスクリプトにエクスポートする簡単なオプション、または描画されたものを保存して複製するという難しいオプションがあります。

今のところ、意図したとおりに機能するようにコードを調整する例を次に示します(ただし、キャンバスに描画するオプションをお勧めします)。

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()
于 2013-01-25T23:20:13.827 に答える