每5秒显示并刷新一次我的照片

时间:2010-07-02 00:35:06

标签: python multithreading tkinter

好的,我已经在tkinter工作中使用了GUI,我试图每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 :(得分: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()

答案 1 :(得分:0)

您应该拨打start()而不是run()。来自Documentation

  

创建一个线程对象后,它就会出现   必须通过调用启动活动   线程的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()