我有一个运行主线程的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()