Python 多处理绘图到 Tkinter Canvas

Python Multiprocessing Drawing to Tkinter Canvas

我有一个程序使用多核处理图像,然后绘制到 canvas 主视图(使用多处理)。我想知道解决这个问题的最佳方法。

是否可以让每个核心绘图都属于它自己的canvas,它们在同一视图中彼此重叠?是否可能有这种行为?

不,这是不可能的。 GUI 小部件不能在进程之间共享。在某些平台上,这根本不可能;在其他平台上,这是可能的,但只能通过与 Tk 完全不同的方式来做;在其他人身上,它有点工作,但事件循环都搞砸了。因此,结果可能是什么都没有显示,一个或两个进程冻结,GUI 不响应事件,tkinter 在子进程中引发异常,tkinter 创建一个完全独立的独立 GUI,或者,如果你真的很倒霉,有时候事情出乎意料地有效,但其他时候却做其他事情。


但是,这并不意味着没有办法做你想做的事,只是你不能直接做。

最简单的解决方案是编组您的 Canvas 命令并将它们传递给 PipeQueue 以供主进程执行。

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

而且,事实上,您可以在 Pool 上处理任务,完成后只是 return 图像,主进程执行 create_image结果。

混合等待 multiprocessing 异步结果与 tkinter 事件循环有点痛苦,但如果您使用 concurrent.futures,您可以将 create_image 作为回调附加在任务返回的 Future 上。


另一种选择是让后台进程创建离屏 Canvas 对象,向其绘制,然后将结果捕获为 BitmapImagepostscript 渲染,这然后你可以传递给主进程以 blit 到它自己的 Canvas 上。但这要复杂得多;我认为其他解决方案可能更适合您。