线程不会让Tkinter应用程序关闭

时间:2017-05-02 13:15:57

标签: python multithreading tkinter tkinter-canvas

我有一个运行主线程的tkinter应用程序和第二个线程,它从我的覆盆子pi的PiCamera中捕获图像并在主窗口中更新画布。当我停止我的应用程序(使用关闭按钮)时,我更新我的线程类的属性以停止线程,然后等待线程加入并退出应用程序。我使用以下代码将图像更新到我的画布:

im=Image.fromarray(image)
photo=ImageTk.PhotoImage(image=im)
for item in self.window.canvas.find_all():
    self.window.canvas.delete(item)
self.window.canvas.create_image(0,0,anchor=NW,image=photo)

问题是当我停止我的线程时,我被阻止加入方法,我的线程不会停止。经过一些测试,我发现它是阻止我的程序的“photo = ImageTk.PhotoImage(image = im)”。 如果我使用X按钮关闭程序,for循环将继续在输出上运行写入:

Exception AttributeError: "PhotoImage instance has no attribute 
'_PhotoImage__photo'" in <bound method PhotoImage.__del__ of 
<PIL.ImageTk.PhotoImage instance at 0x76a2fbe8>> ignored
Too early to create image

有人知道为什么这条线不会让我的线程停止吗?

这是我的程序的简短摘录:

import *

class Worker(Thread):
    def __init__(self, window):
        Thread.__init__(self):
        self.window = window
        self.stop=False

    def run(self):
        #init camera
        ... 
        #capture loop
        while(self.stop==False):
            for frame in cam.capture_continuous(...)
                image= frame.array 
                im=Image.fromarray(image)
                photo=ImageTk.PhotoImage(image=im)
                for item in self.window.canvas.find_all():
                    self.window.canvas.delete(item)
                self.window.canvas.create_image(0,0,anchor=NW,image=photo)
                if self.stop ==True:
                    break

    def stop(self):
        self.stop=True



class Window(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.thread=Worker(self)
        self.btnQuit=Button(self,text="Quit",command=self.closeApp)
        self.canvas = Canvas(self,width=1280,height=720,bg='white')
        self.canvas.grid(row=1)
        self.btnQuit.grid(row=1,column=2)

        self.thread.start()        

    def closeApp(self):
        self.thread.stop()
        self.thread.join()
        self.quit()

0 个答案:

没有答案