Tkinter使用未保存的图片作为图像
我正在尝试每30秒截取一次屏幕截图,并把它显示在我的图形界面上,下面是我目前的代码。
代码:
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秒内完全冻结,拍完照后又会再冻结一次。
谢谢 :)
2 个回答
0
tk的图像可以接受一个叫“data”的选项,这个选项让你可以用base64格式来指定图像数据。此外,PIL(Python图像库)也提供了一些方法来复制和粘贴图像数据。你可以尝试把MyImage里的数据复制到MyPhotoImage里,看看能不能成功。
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()