Tkinter使用未保存的图片作为图像

0 投票
2 回答
1181 浏览
提问于 2025-04-16 00:02

我正在尝试每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()

撰写回答