Отображение и обновление моей картинки каждые 5 секунд

1

Хорошо, у меня есть GUI в 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()

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

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

Теги:
multithreading
tkinter

2 ответа

0
Лучший ответ

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

Как только объект потока создается, его деятельность должна быть запущена путем вызова метод start(). Эта вызывает метод run() в отдельном поток управления.

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

EDIT: Я не уверен, что это работает:

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
    Хорошо это осознаю, поэтому я и обратился за помощью, так как порождение бесконечных потоков недопустимо. Кажется, что ответ выше, как ответили на эту проблему. Спасибо
  • 0
    Количество потоков не должно превышать 2 в большинстве случаев из-за ожидания, который передаст управление другому потоку и завершит его.
Показать ещё 6 комментариев
0

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

Как насчет:

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

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()))
Picturelabel = Label(BalanceFrame, image=MyPhotoImage)
Picturelabel.grid(row=3, column=2, columnspan=3)

class PictureThread(threading.Thread):
    def run(self):
        while True:
            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)
            Picturelabel.image = MyPhotoImage 

PictureThread().start()

window.mainloop()
  • 0
    Это до сих пор не производит графический интерфейс.
  • 0
    Попробуйте запустить вместо запуска, как предложено pcostesi
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню