Tkinter использует несохраненную картинку в качестве картинки - PullRequest
0 голосов
/ 16 июня 2010

Я пытаюсь захватывать скриншот каждые 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 голосов
/ 16 июня 2010

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

0 голосов
/ 16 июня 2010

Вы должны быть в состоянии использовать 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()
...