PIL:单击事件后跳转到下一张照片

时间:2018-11-15 12:43:50

标签: python tkinter python-imaging-library

我正在准备用于深度运行的数据。因此,我必须为每张图片获取特定的像素坐标。每张照片仅需要一个坐标。 因此,当我使用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()

1 个答案:

答案 0 :(得分:2)

我不是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()