1

我正在尝试编写一个代码,该代码将在鼠标坐标处放置一个点/线/任何东西,也就是 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()

应该添加什么?也许还有其他更好的模块可以做到这一点?

4

1 回答 1

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