2013-12-01 6 views
0

Я занимаюсь фотографией с камеры и отображаю изображения на холсте Tkinter. Тем не менее, появляется странное явление, что полотно будет мигать с кодом нижеpython Tkinter Показать изображения на холсте, он всегда мигает

def get_image_cam() : 
    global cam,cam_flag,cam_image, cam_imageTk, canvas_img 
    print '[THREAD CREATE]get image camera' 
    print cam_flag 
    while cam_flag : 
     image = cam.get_image() 
     pygame.image.save(image,'capture.bmp') 
     cam_image = Image.open('capture.bmp') 
     cam_imageTk = ImageTk.PhotoImage(cam_image) 
     canvas_img.create_image(0, 0, anchor = NW ,image = cam_imageTk) 

    print '[THREAD EXIT] get image camera' 
    thread.exit_thread() 

У меня есть поиск много, чтобы решить эту проблему. Ниже приведен код sinppets из http://codingmess.blogspot.com/2008/07/showing-webcam-image-in-desktop-window_08.html, это действительно помогает

def showimage(image): 
    '''Loads given image and puts it into the window''' 
    img = Image.open(image) 
    photo = ImageTk.PhotoImage(img) 
    container.canvas.create_image(container.width/2+2, container.height/2, image=photo) 
    container.obr = photo # why is this line necessary? 

как автор посту высказывания, он не знал, почему это «container.obr = фото» помогает. Я сделал то же самое с моим кодом. Он изменился следующим образом:

def get_image_cam() : 
    global cam,cam_flag,cam_image, cam_imageTk, canvas_img 
    print '[THREAD CREATE]get image camera' 
    print cam_flag 
    while cam_flag : 
     image = cam.get_image() 
     pygame.image.save(image,'capture.bmp') 
     cam_image = Image.open('capture.bmp') 
     cam_imageTk = ImageTk.PhotoImage(cam_image) 
     canvas_img.create_image(0, 0, anchor = NW ,image = cam_imageTk) 
     obr = cam_imageTk # variable 'obr' is not neccessary, you can change it to anything you want 

    print '[THREAD EXIT] get image camera' 
    thread.exit_thread() 

Может ли кто-нибудь помочь мне объяснить это? Заранее спасибо.

ответ

0

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

Вы должны назначить это существующей глобальной переменной или существующему объекту.

+0

Это звучит разумно, а 'obr' не является глобальной переменной или существующим объектом *** в моей функции ***. разве он не будет удален сборщиком мусора? Или, если объект 'PhotoImage' назначен переменной, он не будет удален сборщиком мусора? –

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