Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理绘图到Tkinter画布_Python_Tkinter_Multiprocessing_Tkinter Canvas - Fatal编程技术网

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包装器),或者至少转到其他地方