2010-06-16 19 views
0

我試圖抓住屏幕截圖,每隔30秒並在我的GUI上顯示它,繼承我迄今爲止的內容。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

試過這個,它沒有錯誤的工作,但沒有圖像顯示。仍然在琢磨尋找問題。 – 2010-06-16 21:25:49

+0

查看上面的編輯。 – Mark 2010-06-17 14:07:05

+0

真棒,它的工作,感謝您的幫助:) – 2010-06-17 22:42:02

0

tk圖像接受一個「數據」選項,它允許您指定以base64編碼的圖像數據。此外,PIL爲您提供了複製和粘貼圖像數據的方法。應該可以將MyImage中的數據複製到MyPhotoImage。你嘗試過嗎?

+0

不太確定你的意思,我到底該如何將數據從MyImage複製到MyPhotoImage。 我剛剛嘗試過「MyPhotoImage = PhotoImage(copy = MyImage)」,但沒有奏效。 – 2010-06-16 21:22:19