2012-03-26 11 views
1

В настоящее время я пытаюсь настроить GUI в Tkinter, чтобы показать последовательность изображений (с именем file01.jpg, file02.jpg и т. Д.). В настоящее время я делаю это путем создания объекта Sequence для управления списком изображений, которые я забочусь о:Анализ последовательности изображений с использованием PIL/Tkinter

class Sequence: 
    def __init__(self,filename,extension): 
     self.fileList = [] 
     #takes the current directory 
     listing = os.listdir(os.getcwd()) 
     #and makes a list of all items in that directory that contains the filename and extension 
     for item in listing: 
      if filename and extension in item: 
       self.fileList.append(item) 
     #and then sorts them into order 
     self.fileList.sort() 
     print self.fileList 

    def nextImage(self): 
     #returns a string with the name of the next image 
     return self.fileList.pop(0) 

И тогда я использую довольно простой Tkinter сценарий, я нашел в Интернете, чтобы создать окно и разместить изображение есть:

window = Tkinter.Tk() 
window.title('Image Analysis!') 
sequence = Sequence('test','jpg') 

image = Image.open("test01.jpg") 
image = image.convert('L') 
imPix = image.load() 
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) 
window.bind("<space>", lambda e: nextFrame(sequence_object=sequence,event=e)) 
Tkinter.mainloop() 

где nextFrame определяется как:

def nextFrame(sequence_object,event=None): 
    nextImage = sequence_object.nextImage() 
    print 'Next Image is: ',nextImage 
    image = Image.open(nextImage) 
    image = image.convert('L') 
    imPix = image.load() 
    image_tk = ImageTk.PhotoImage(image) 
    canvas.create_image(image.size[0]//2, image.size[1]//2, image=image_tk) 
    canvas.update() 

В моем питона буфере я вижу правильную последовательность изображений всплывал ('Next изображение: test02, JPG' и т.д.), но новый им возраст никогда не всплывает!

У кого-нибудь есть объяснения, почему изображение не появляется?

Спасибо!

Nathan lachenmyer

ответ

1

Вероятно, что происходит в том, что изображение становится уничтожен сборщиком мусора, так как только ссылка на изображение является локальной переменной.

Попытайтесь держать постоянную ссылку на изображение, например:

... 
self.image_tk = ImageTk.PhotoImage(image) 
... 
+0

Похоже, вы правы! Простой 'global image_tk' внутри nextFrame() исправил его. –

+0

@asymptoticdesign: везде, где вы создаете переменную для хранения изображения, убедитесь, что переменная не является локальной. –

Смежные вопросы