Захват координат x, y с помощью Python PIL

Я хочу отобразить изображение пользователю с помощью PIL, и когда пользователь щелкает где-либо на этом изображении, я хочу, чтобы вызывалась функция def onmousedown(x,y). Я сделаю некоторые дополнительные вещи в этой функции. Как я могу сделать это в PIL?

Спасибо,


person BBSysDyn    schedule 21.12.2011    source источник
comment
PIL — это просто библиотека изображений, с ее помощью вы можете создавать изображения. Отображение изображения и захват события клика — это работа движка пользовательского интерфейса. Какой король пользовательского интерфейса у вас есть/хотите?   -  person Ski    schedule 21.12.2011


Ответы (2)


PIL не сделает это в одиночку — PIL — это библиотека для работы с изображениями без пользовательских интерфейсов — у нее есть метод show, который открывает внешнюю программу, которая отображает изображение, но не взаимодействует с процессом Python.

Следовательно, чтобы заставить пользователя взаимодействовать с изображением, необходимо создать программу с графическим интерфейсом, используя один из консолидированных наборов инструментов для использования с Python — наиболее известными из них являются 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()
person jsbueno    schedule 21.12.2011

Вот еще один похожий пост

Как отобразить изображение и получить координату щелчка мыши это

На 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()
person BBSysDyn    schedule 21.12.2011