Загружайте несколько изображений одно за другим в холст с помощью tkinter - PullRequest
0 голосов
/ 04 июня 2018

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

from Tkinter import *
from PIL import Image, ImageTk
import os

array = []
tuplee = ()
count = 0
d = 0
f = 1
FileDir = ""

#Load all files from directory
File = os.listdir('frames/')
#print(File)

if __name__ == "__main__":
    root = Tk()

#setting up a tkinter frame and canvas
frame = Frame(root, bd=2, relief = SUNKEN)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)

canvas = Canvas(frame, bd=1, width=950, height=600)
canvas.grid(row=0, column=0, sticky=N+S+E+W)

frame.pack(fill=BOTH,expand=1)

FileDir = 'C:/Users/cvcrb/Desktop/NumberPlate/frames/' + File[0]
img = ImageTk.PhotoImage(Image.open(FileDir))
canvas.create_image(0,0,image=img,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))

def load_image():
    FileDir = 'C:/Users/cvcrb/Desktop/NumberPlate/frames/' + File[f]
    img = ImageTk.PhotoImage(Image.open(FileDir))
    canvas.create_image(0,0,image=img,anchor="nw")
    canvas.config(scrollregion=canvas.bbox(ALL))

    #root.update_idletasks()
    #root.after(100,load_image)

#function to be called when mouse is clicked
def printcoords(event):
    global count
    global d
    global FileDir
    global f
    for i in range(1):
        array.append(event.x)
        array.append(event.y)
        tuplee = tuple(array)
        print (tuplee)
        count += 1
        if count == 2:                  
            print ("Cropping...")
            crop(FileDir, tuplee, 'cropped%d.jpg' % d)
            d += 1
            print ("Cropped")
            count = 0
            canvas.destroy()            #canvas closes after 2 clicks
        load_image()                    #should load the next image 

#mouseclick event
canvas.bind("<Button 1>",printcoords)



#function to crop a certain area using coordinates
def crop(image_path, coords, saved_location):
    image_obj = Image.open(image_path)
    cropped_image = image_obj.crop(coords)
    cropped_image.save(saved_location)
    image_obj.close()


root.mainloop()

1 Ответ

0 голосов
/ 05 июня 2018

Основная ошибка в вашем коде состоит в том, что вы не меняете свою переменную f, поэтому ваш load_image() просто загружает одно и то же изображение снова и снова.

Вторая важная проблема заключалась в том, что вы не наделилине нужно делать canvas.destroy().Достаточно сделать canvas.delete("all") перед созданием нового изображения.

Вот ваш модифицированный код, который хорошо работает для меня:

from Tkinter import *
from PIL import Image, ImageTk
import os

array = []
tuplee = ()
f = 1
FileDir = ""

#Load all files from directory
File = os.listdir('frames/')
#print(File)

if __name__ == "__main__":
    root = Tk()

#setting up a tkinter frame and canvas
frame = Frame(root, bd=2, relief = SUNKEN)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)

canvas = Canvas(frame, bd=1, width=950, height=600)
canvas.grid(row=0, column=0, sticky=N+S+E+W)

frame.pack(fill=BOTH,expand=1)

FileDir = 'frames/' + File[0]
img = ImageTk.PhotoImage(Image.open(FileDir))
cimg = canvas.create_image(0,0,image=img,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))

def load_image():
    global canvas, img, FileDir
    FileDir = 'frames/' + File[f]
    canvas.delete("all")
    #del img
    #del canvas
    #canvas = Canvas(frame, bd=1, width=950, height=600)
    #canvas.grid(row=0, column=0, sticky=N+S+E+W)
    img = ImageTk.PhotoImage(Image.open(FileDir))
    canvas.create_image(0,0,image=img,anchor="nw")
    canvas.config(scrollregion=canvas.bbox(ALL))

    #root.update_idletasks()
    #root.after(100,load_image)

#function to be called when mouse is clicked
def printcoords(event):
    global FileDir
    global f
    global array
    array.append(event.x)
    array.append(event.y)
    tuplee = tuple(array)
    print (tuplee)
    if len(tuplee)==4:
        print ("Cropping...")
        crop(FileDir, tuplee, 'cropped%d.jpg' % f)
        print ("Cropped")
        array = []
        f += 1
        load_image()                    #should load the next image

#mouseclick event
canvas.bind("<Button 1>",printcoords)



#function to crop a certain area using coordinates
def crop(image_path, coords, saved_location):
    image_obj = Image.open(image_path)
    cropped_image = image_obj.crop(coords)
    cropped_image.save(saved_location)
    image_obj.close()


root.mainloop()

ПРИМЕЧАНИЕ. Я удалил C:/Users/cvcrb/Desktop/NumberPlate/ из имен файлов.Поэтому, если скрипт не может найти файлы на вашем компьютере, вам может понадобиться добавить их обратно в код.

...