Отображение и обновление моей картинки каждые 5 секунд - PullRequest
1 голос
/ 02 июля 2010

Хорошо, у меня работает графический интерфейс в tkinter, и я пытаюсь захватывать и отображать изображение каждые 5 секунд и отображать его в метке с именем Picturelabel.

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

class PictureThread(threading.Thread):
    def run(self):
        print "test"
        box = (0,0,500,500) #x,x,width,height
        MyImage = ImageGrab.grab(box)

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

        time.sleep(5)
        PictureThread().run() #If I get rid of this then it just display one image
        return MyPhotoImage

MyVeryNewImage = PictureThread().run()

Picturelabel = Label(BalanceFrame, image=MyVeryNewImage)
Picturelabel.grid(row=3, column=2, columnspan=3)
Picturelabel.image = MyVeryNewImage

window.mainloop()

Во-первых, как я могу очиститьэтого кода, так как запуск потока внутри другого потока не может быть хорошей практикой.

Также, когда я запускаю его, он печатает «test» в консоли, но не вызывает GUI.Если я закомментирую закомментированный текст (PictureThread (). Run (), где я создаю еще один поток внутри него.), Тогда он отображает первое изображение, но не больше.

Ответы [ 2 ]

0 голосов
/ 02 июля 2010

Вы должны позвонить start() вместо run(). Из документации :

После создания объекта потока его деятельность должна быть начата по телефону метод start () потока. это вызывает метод run () в отдельном нить контроля.

Я вижу, что вы вызываете новую нить внутри вашего run() метода. Это заставит вас порождать бесконечные темы!

РЕДАКТИРОВАТЬ: Я не уверен, что это работает:

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


Picturelabel = Label(BalanceFrame)
Picturelabel.grid(row=3, column=2, columnspan=3)

class PictureThread(threading.Thread):

    def run(self):
        print "test"
        box = (0,0,500,500) #x,x,width,height
        fp = cStringIO.StringIO()
    while(1):
            MyImage = ImageGrab.grab(box)
            MyImage.save(fp, 'GIF')
            self.image = PhotoImage(data=base64.encodestring(fp.getvalue()))
            Picturelabel.image = self.image
            fp.reset() # reset the fp position to the start
            fp.truncate() # and truncate the file so we don't get garbage 
            time.sleep(5)

PictureThread().start()
window.mainloop()
0 голосов
/ 02 июля 2010

Проблема в том, что вы возвращаете новое изображение из PictureThread (). Run () в методе, но никогда не сохраняете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...