使用Python PIL捕获x,y坐标

8
我想使用PIL向用户展示一张图片,当用户在该图片上点击任何位置时,我希望调用一个名为onmousedown(x,y)的函数。在这个函数中,我会做一些额外的事情。如何使用PIL实现这个功能?
谢谢。

4
PIL只是一种图像处理库,可以用它创建图像。显示图像和捕获点击事件是用户界面引擎的工作。您现在有什么/想要哪种类型的用户界面? - Ski
2个回答

10
不能单独完成此任务——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()

2

这里有另一篇相关的文章

如何显示图片并获取其上鼠标点击的坐标

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接