python - 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()
解决方案
我不是 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()
推荐阅读
- aix - AIX :- 在基于 Clang 的前端中调用共享库函数时出现分段错误
- android - .FBX 中的多个 3D 对象 - 如何对每个对象应用不同的纹理
- java - 如何从字符串中提取所有整数并将其转换为 Java 中指定的 char 值?
- python - Celery:发送任务时忽略交换名称
- android - 不记名令牌请求http颤动
- graphql - graphql 对所有或少数模式字段的单选查询
- android - 从 TextInputEditText 中删除底线
- html - 如何防止浏览器在移动视口中加载图像
- jenkins - 需要有一个动态的电子邮件通知
- reactjs - 使用 React Final Form 向 RadioGroup 字段添加自定义道具