我想使用PIL向用户展示一张图片,当用户在该图片上点击任何位置时,我希望调用一个名为onmousedown(x,y)的函数。在这个函数中,我会做一些额外的事情。如何使用PIL实现这个功能?
谢谢。
谢谢。
show
方法可以打开一个外部程序来显示图像,但不与 Python 进程通信。
因此,为了让用户与图像交互,必须使用其中一个用于 Python 的整合工具包构建 GUI 程序。比较常见的有 Tkinter、GTK 和 Qt4。Tkinter 很有趣,因为它已经预装在 Windows Python 中,因此对该系统的用户更易获取。如果你选择使用其他工具包之一,则 Windows 用户需要单独下载和安装 gtk 或 qt 库才能使用你的程序。
这是一个使用 Tkinter 应用程序的最简示例,其中包含一个可点击的图像:
import Tkinter
from PIL import Image, ImageTk
from sys import argv
window = Tkinter.Tk(className="bla")
image = Image.open(argv[1] if len(argv) >=2 else "bla2.png")
canvas = Tkinter.Canvas(window, width=image.size[0], height=image.size[1])
canvas.pack()
image_tk = ImageTk.PhotoImage(image)
canvas.create_image(image.size[0]//2, image.size[1]//2, image=image_tk)
def callback(event):
print "clicked at: ", event.x, event.y
canvas.bind("<Button-1>", callback)
Tkinter.mainloop()
这里有另一篇相关的文章
在Ubuntu上安装
sudo apt-get install python python-tk idle python-pmw python-imaging python-imaging-tk
然后就可以正常使用了。
我在@jsbueno的解决方案中添加了一个调整大小的功能,并修复了一个导入问题。
import Tkinter
from PIL import ImageDraw, Image, ImageTk
import sys
window = Tkinter.Tk(className="bla")
image = Image.open(sys.argv[1] if len(sys.argv) >=2 else "bla2.png")
image = image.resize((1000, 800), Image.ANTIALIAS)
canvas = Tkinter.Canvas(window, width=image.size[0], height=image.size[1])
canvas.pack()
image_tk = ImageTk.PhotoImage(image)
canvas.create_image(image.size[0]//2, image.size[1]//2, image=image_tk)
def callback(event):
print "clicked at: ", event.x, event.y
canvas.bind("<Button-1>", callback)
Tkinter.mainloop()