使用带有python的imagemagick合成多组图像时线程延迟

使用带有python的imagemagick合成多组图像时线程延迟,python,imagemagick,imagemagick-convert,Python,Imagemagick,Imagemagick Convert,我正在raspberry pi中构建一个应用程序,用户点击一个按钮,该应用程序在一些倒计时后拍摄3张照片,并将这3张照片放入照片模板中。第一次点击的效果与预期一样,但如果我第二次点击它,它会倒计时,但直到几秒钟后它才开始拍照,我点击按钮越多,延迟就越大。问题是当应用程序将3张照片合成到模板中时,这需要一些时间来处理,并且会延迟用于捕获照片的线程。这是因为ImageService.py的createPhotoboothImage函数中的bash命令无法异步执行,还是我的线程有问题?任何帮助或建议都

我正在raspberry pi中构建一个应用程序,用户点击一个按钮,该应用程序在一些倒计时后拍摄3张照片,并将这3张照片放入照片模板中。第一次点击的效果与预期一样,但如果我第二次点击它,它会倒计时,但直到几秒钟后它才开始拍照,我点击按钮越多,延迟就越大。问题是当应用程序将3张照片合成到模板中时,这需要一些时间来处理,并且会延迟用于捕获照片的线程。这是因为ImageService.pycreatePhotoboothImage函数中的bash命令无法异步执行,还是我的线程有问题?任何帮助或建议都会很好

GUIApp.py

类GUIApp: 定义初始化(自): self.root=tk.tk() self.root.attributes('-zoomed',True) self.buttonCountDown=tk.Button(text='countdown',command=self.capturePhotos) self.buttonCountDown.pack() self.label=tk.label(text='Ready!',bg='3D434F',fg='white',font=('Helvetica',100',bold')) self.label.pack(side='top',fill='both',expand=True) self.queue=queue.queue() self.captureQueue=queue.queue() self.imageProcessQueue=queue.queue() self.imageService=imageService.imageService() self.cameraService=cameraService.cameraService() self.imageCount=0 self.images=[] threading.Thread(target=self.listenToCaptureQueue).start() threading.Thread(target=self.listenToQueue.start()) threading.Thread(target=self.listenToImageProcessQueue).start() self.root.mainloop() def倒计时(自身,秒): 对于范围内的i(秒,0,-1): self.queue.put(一) 时间。睡眠(1) self.queue.put('SMILE!') 时间。睡眠(1) self.captureQueue.put(True) def listenToQueue(自): 尽管如此: 尝试: 如果self.queue.empty()==False: s=self.queue.get(0) self.label['text']=s elif self.queue.empty()==True: 通过 队列除外。空: 通过 def ListentCaptureQueue(自): 尽管如此: 尝试: 如果self.captureQueue.empty()==False: 如果self.captureQueue.get(0): ##拍照 self.label['text']=“请稍候…” filePath=self.cameraService.captureImage() self.images.append(“%r”%filePath) self.imageCount+=1 如果self.imageCount<3: #再次启动定时器拍照 threading.Thread(target=self.countDown,args=(3,).start() 其他: self.buttonCountDown['state']='normal' self.label['text']='Ready!' self.imageProcessQueue.put(self.images) elif self.captureQueue.empty()==True: 通过 队列除外。空: 通过 def listenToImageProcessQueue(自身): 尽管如此: 尝试: 如果self.imageProcessQueue.empty()==False: #将3张照片合成到模板中 images=self.imageProcessQueue.get(0) templatePath='/home/pi/Documents/Test/template.jpg' destinationPath='/home/pi/Documents/Test/compositeImage.jpg' self.imageService.createPhotoboothImage(图像、模板路径、目标路径) elif self.imageProcessQueue.empty()==True: 通过 队列除外。空: 通过 def capturePhotos(自拍): self.images=[] self.imageCount=0 self.buttonCountDown['state']='disabled' threading.Thread(target=self.countDown,args=(5,).start() ImageService.py

class图像服务:
def createPhotoboothImage(自身、图像、模板路径、目标路径):
cmd='convert'+templatePath+'\('+images[0]+'-缩放“18.5%”)-几何+53+401-复合\('+images[1]+'-缩放“9.02%”)-几何+1205.5+401-复合\('+images[2]+'-缩放“9.02%”)-几何+1205.5+790-复合\+目标路径
subprocess.call(cmd,shell=True)

由于全局解释器锁,线程在Python中不会并行运行,如果您确实需要并行执行,请使用进程。例如,请参阅模块。

这很有意义!我会在一天结束时试试这个。