Python多处理工程图到Tkinter画布

时间:2018-06-26 17:57:14

标签: python tkinter multiprocessing tkinter-canvas

我有一个程序,该程序使用多个核心来处理图像,然后再绘制到画布上以显示主视图(使用多重处理)。我想知道解决此问题的最佳方法。

是否可以将每个核心工程图放到其自有画布上,它们在同一视图中彼此叠置?可能有这种行为吗?

1 个答案:

答案 0 :(得分:2)

否,这是不可能的。 GUI窗口小部件不能在进程之间共享。在某些平台上,这根本不可能。在其他平台上,这是可能的,但是只能通过与Tk所做的方式截然不同的方式来完成;在其他情况下,这是可行的,但是事件循环都被搞砸了。因此,结果可能是什么都没显示,一个或两个进程冻结,GUI不响应事件,tkinter在子级中引发异常,tkinter创建了一个完整的独立的GUI,或者,如果真的很不幸,有时候事情会无法预测地起作用,而其他时候却会做其他事情之一。


但是,这并不意味着您无法做自己想做的事,只是不能直接做。

最简单的解决方案是封送Canvas命令并将它们传递到PipeQueue上,以使主进程得以执行。

一个完全通用的解决方案并不难,但是在您的情况下,它应该更简单:您希望后台处理要做的就是处理图像然后显示它。因此,您唯一需要的Canvas命令是create_image

实际上,您可能可以在Pool上完成任务,完成任务后只需return图像,而主流程使用create_image结果。

使用tkinter事件循环混合等待multiprocessing异步结果有点麻烦,但是如果您使用concurrent.futures,则可以将create_image附加为回调Future由任务返回。


另一种选择是让后台进程创建屏幕外的Canvas对象,对其进行绘制,然后将结果捕获为BitmapImagepostscript渲染,您可以然后传递到主进程,使其自身变为Canvas。但这要复杂得多。我认为其他解决方案可能对您更好。