首页 > 解决方案 > PIL:单击事件后跳转到下一张照片

问题描述

我正在为深度运行准备数据。所以我必须为每张图片获取某些像素坐标。每张照片只需要一个坐标。所以当我使用PIL点击输入时,我尝试实现坐标,这样我就可以去下一张图片了。但是,当我编写如下代码时,坐标重复输出到一张图片,而下一张图片不会出现在屏幕上。如何确保在一张图片上只记录一个坐标?

from PIL import Image, ImageTk
import tkinter

import os
URL = './SavedImage/'
imgList = os.listdir(URL)
print(imgList)
width = 852
height = 480
stepW = 852/4
stepH = 480/5
def callback(event):
   print("clicked at: ", event.x, event.y)

window = tkinter.Tk(className='pla')
for file in sorted(imgList):
    a=True
    image = Image.open(os.path.join(URL, file))
    print(image)
    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)
    canvas.bind("<Button-1>", callback)
    tkinter.mainloop()

标签: pythontkinterpython-imaging-library

解决方案


我不是 100% 确定我了解您需要什么,但在我看来,您正在尝试为图像列表中的每个图像获取一组绳索。

我会通过创建一个函数和一个跟踪变量来一次循环遍历每个图像,然后单击更新一个带有图像的新列表,然后再循环到下一个图像。

如果您有任何问题,请告诉我。

例子:

from PIL import Image, ImageTk
import tkinter
import os

URL = './SavedImage/'
imgList = os.listdir(URL)
width = 852
height = 480
stepW = 852/4
stepH = 480/5
tracker = 0
list_images_with_cords = [] # added list for final results

def callback(event):
    # Added global's.
    global tracker,list_images_with_cords
    # Used to append final results to list.
    list_images_with_cords.append([imgList[tracker], event.x, event.y])
    # This tracker lets us go through each item on the list.
    tracker += 1
    # After appending list go to next image.
    open_next()

window = tkinter.Tk(className='pla')
# Creates just one canvas that we can update later.
canvas = tkinter.Canvas(window)
canvas.pack()

def open_next():
    # Adding global's.
    global image, canvas, image_tk, tracker
    # Clearing canvas before drawing new image.
    canvas.delete("all")
    # Checking for valid index in list.
    if tracker < len(imgList):
        image = Image.open(os.path.join(URL, imgList[tracker]))
        # use config() to update canvas.
        canvas.config(width=image.size[0], height=image.size[1])
        image_tk = ImageTk.PhotoImage(image)
        canvas.create_image(image.size[0]//2, image.size[1]//2, image=image_tk)
        canvas.bind("<Button-1>", callback)
    else:
        # This else statement is just for when we run out of images.
        # It will display all the results in a textbox.
        canvas.destroy()
        txt = tkinter.Text(window, width=25)
        txt.pack()
        for item in list_images_with_cords:
            txt.insert("end", "{}\n\n".format(item))

open_next()
tkinter.mainloop()

推荐阅读