我已经看到很多关于在子进程或线程中运行代码的东西,并且使用multiprocessing
andthreading
模块真的很容易。但是,在 GUI 中执行此操作会增加额外的复杂性。
据我了解,如果您尝试从多个线程(或进程)操作它们,GUI 类不喜欢它。解决方法是将数据从您创建的任何线程发送到负责图形的线程,然后在那里渲染。
不幸的是,对于我想到的场景,这不是一个选项:我创建的 gui 允许用户编写自己的绘图代码,然后执行。这意味着我无法控制它们的精确绘图方式,我也不想拥有它。(更新:这些图显示在单独的窗口中,不需要嵌入到主 GUI 中的任何位置。我希望它们与主 GUI 分开存在,而不共享任何底层图形库堆栈。)
所以我现在想知道的是
是否有一些干净(ish)的方式在一个全新的解释器实例中执行一串python代码,并与窗口系统有自己的联系?
回应评论:
当前应用程序设置如下: 一个简单的 python 脚本加载一个 wxPython gui(一个 wx.App)。使用此 gui 用户可以设置模拟,其中一部分涉及在普通 python 中创建一个脚本,该脚本运行模拟并对结果进行后处理(这通常涉及绘制和显示它们)。目前我通过简单地在脚本代码上调用 exec() 来做到这一点。这工作正常,但在模拟运行时 gui 冻结。我已经尝试在子进程中运行嵌入式脚本,它也可以正常工作,直到您尝试显示创建的图形(通常使用 matplotlib 的 show())。此时,wxPython、wx、gtk 等堆栈深处的某个库开始抱怨,因为您无法从多个线程操作它。我想要的设置to have 大致相同,但不是嵌入式脚本与主应用程序共享 GUI,而是希望它在自己的环境中显示图形。
只是为了澄清:
这不是关于“我如何进行多线程/多处理”甚至“我如何在单个 wxpython gui 中进行多线程/多处理”的问题。问题是如何从加载全新gui 的 gui 启动脚本。如何让窗口管理器将此脚本视为一个完全独立的应用程序?
最简单的方法是在某个临时文件夹中生成它,然后对 python 解释器进行非阻塞调用,但这会使通信更加困难,并且很难知道何时可以再次删除临时文件。我希望有一种更清洁、更动态的方式来做到这一点。