Python多处理绘图到Tkinter画布
我有一个程序,它使用多个核心来处理图像,然后将图像绘制到主视图的画布上(使用多处理)。我想知道解决这个问题的最佳方法Python多处理绘图到Tkinter画布,python,tkinter,multiprocessing,tkinter-canvas,Python,Tkinter,Multiprocessing,Tkinter Canvas,我有一个程序,它使用多个核心来处理图像,然后将图像绘制到主视图的画布上(使用多处理)。我想知道解决这个问题的最佳方法 是否有可能将每个核心图纸放在自己的画布上,这些画布在同一视图中层叠在一起?可能有这种行为吗?不,不可能。GUI小部件不能在进程之间共享。在某些平台上,这根本不可能;在其他平台上,这是可能的,但前提是做的事情与传统知识非常不同;在其他情况下,这有点可行,但事件循环都搞砸了。因此,结果可能是什么都没有显示,一个或两个进程冻结,GUI不响应事件,tkinter在子进程中引发异常,tki
是否有可能将每个核心图纸放在自己的画布上,这些画布在同一视图中层叠在一起?可能有这种行为吗?不,不可能。GUI小部件不能在进程之间共享。在某些平台上,这根本不可能;在其他平台上,这是可能的,但前提是做的事情与传统知识非常不同;在其他情况下,这有点可行,但事件循环都搞砸了。因此,结果可能是什么都没有显示,一个或两个进程冻结,GUI不响应事件,tkinter在子进程中引发异常,tkinter创建了一个完整的独立GUI,或者,如果你真的不走运,事情有时会不可预测地工作,但有时会做其他事情
然而,这并不意味着没有办法做你想做的事,只是你不能直接做 最简单的解决方案是封送您的
Canvas
命令,并将它们传递给管道
或队列
,以便主进程执行
一个完全通用的解决方案并不是那么难,但在您的例子中,它应该更简单:您只需要后台处理程序处理一个图像,然后显示它。因此,您需要的唯一Canvas
命令是create\u image
而且,实际上,您可能可以在池中执行任务,任务完成后,只返回图像,主进程使用结果执行创建图像
将等待多处理
异步结果与tkinter事件循环混合在一起有点麻烦,但是如果使用并发.futures
,您可以将创建_映像
作为任务返回的未来
的回调
另一种选择是让后台进程创建屏幕外的Canvas
对象,绘制它们,然后将结果捕获为BitmapImage
或postscript
渲染,然后您可以将其传递到主进程,以将其blit到自己的画布上。但这要复杂得多;我认为另一种解决方案可能会对您更有效。不,这是不可能的。GUI小部件不能在进程之间共享。在某些平台上,这根本不可能;在其他平台上,这是可能的,但前提是做的事情与传统知识非常不同;在其他情况下,这有点可行,但事件循环都搞砸了。因此,结果可能是什么都没有显示,一个或两个进程冻结,GUI不响应事件,tkinter在子进程中引发异常,tkinter创建了一个完整的独立GUI,或者,如果你真的不走运,事情有时会不可预测地工作,但有时会做其他事情
然而,这并不意味着没有办法做你想做的事,只是你不能直接做
最简单的解决方案是封送您的Canvas
命令,并将它们传递给管道
或队列
,以便主进程执行
一个完全通用的解决方案并不是那么难,但在您的例子中,它应该更简单:您只需要后台处理程序处理一个图像,然后显示它。因此,您需要的唯一Canvas
命令是create\u image
而且,实际上,您可能可以在池中执行任务,任务完成后,只返回图像,主进程使用结果执行创建图像
将等待多处理
异步结果与tkinter事件循环混合在一起有点麻烦,但是如果使用并发.futures
,您可以将创建_映像
作为任务返回的未来
的回调
另一种选择是让后台进程创建屏幕外的Canvas
对象,绘制它们,然后将结果捕获为BitmapImage
或postscript
渲染,然后您可以将其传递到主进程,以将其blit到自己的画布上。但这要复杂得多;我认为另一种解决方案可能会对您更好。您不能在进程之间共享GUI小部件。根据您的平台,它要么什么都不做,要么冻结,引发异常,创建两个独立的GUI副本,或者,如果您真的很不幸,有时不可预测地工作,但有时做其他事情。一个选项是通过管道
或队列
代理画布绘制命令,让主进程执行这些命令。由于您可能使用的唯一画布绘制命令是create\u image
,因此这应该非常简单。事实上,您可能只需要使用池
或ProcessPoolExecutor
,并在子进程上运行后台任务,然后返回要绘制的图像。另一个选项是绘制到屏幕外的画布
,然后获取(位图、PS等)将其传递给父进程的内容将被blit到其画布上。如果将图像显示到画布上是您的性能瓶颈,多处理
对您没有帮助。您可能需要切换到其他GUI库。Qt(通过PyQt5
或PySide2
)、wx
等应该能够处理更多的问题。或本机平台包装器,如pyobjc
或PyWin32
或Xlib
包装器之一。如果没有,您必须直接转到OpenGL(有一些Python包装器),或者至少转到其他地方