2010-06-16 2 views
0

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

Код:

from Tkinter import * 
from PIL import ImageGrab 

window = Tk() 

box = (100,100,400,400) 
MyImage = ImageGrab.grab(box) 

MyPhotoImage = PhotoImage(file=MyImage) #I know this is where its going wrong, just not sure how to fix it 
PictureLabel = Label(window, image=MyPhotoImage) 
PictureLabel.pack() 

window.mainloop() 

Python не любит тот факт, я не сохранили изображение, есть возможный способ сделать это без сохранения изображения (не особого смысла, так как его обновляется каждые 30 секунд)

Его также не экономит каждые 30 секунд, есть ли простой способ сделать это без зависания программы? Как я мог просто использовать time.sleep (30), но программа просто замерзла бы на 30 секунд, сделав снимок, затем снова замерзнет.

Спасибо :)

ответ

0

Вы должны быть в состоянии использовать StringIO для этого:

import cStringIO 
fp = cStringIO.StringIO() 
MyImage.save(fp,'GIF') 
MyPhotoImage = PhotoImage(data=fp.getvalue()) 

редактирует

Похоже, я должен прочитать документы немного ближе. Данные PhotoImage должны быть закодированы в base64

from Tkinter import * 
from PIL import ImageGrab 
import cStringIO, base64 

window = Tk() 

box = (100,100,500,500) 
MyImage = ImageGrab.grab(box) 

fp = cStringIO.StringIO() 
MyImage.save(fp,'GIF')  

MyPhotoImage = PhotoImage(data=base64.encodestring(fp.getvalue())) 
PictureLabel = Label(image=MyPhotoImage) 
PictureLabel.pack() 
PictureLabel.image = MyPhotoImage 

window.mainloop() 
+0

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

+0

См. Правки выше. – Mark

+0

Удивительно, что это сработало, спасибо за помощь :) –

0

т.к изображения принимают опцию «данных», который позволяет определить данные изображения, закодированные в base64. Кроме того, PIL предоставляет вам способы копирования и вставки данных изображения. Должна быть возможность скопировать данные из MyImage в MyPhotoImage. Вы пробовали это?

+0

Не совсем уверен, что вы имеете в виду, как именно копировать данные из MyImage в MyPhotoImage. Я просто попробовал «MyPhotoImage = PhotoImage (copy = MyImage)», но это не сработало. –

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