我正在搅拌机中为 N 个对象编写脚本。运行我的脚本时,它会在工作时锁定用户界面。我想写一些东西来防止这种情况发生,这样我就可以看到屏幕上发生了什么,并使用我的自定义 UI 来显示进度条。关于如何在 python 或搅拌机中实现这一点的任何想法?大多数计算只需要几分钟,我知道这个请求可能会使它们花费比正常时间更长的时间。任何帮助,将不胜感激。
完成大部分工作的函数是 a for a in b循环。
如果您想在 Blender 中进行大型计算,并且仍然拥有响应式 UI,您可能需要使用 python 计时器检查模型运算符。
它会是这样的:
class YourOperator(bpy.types.Operator):
bl_idname = "youroperatorname"
bl_label = "Your Operator"
_updating = False
_calcs_done = False
_timer = None
def do_calcs(self):
# would be good if you can break up your calcs
# so when looping over a list, you could do batches
# of 10 or so by slicing through it.
# do your calcs here and when finally done
_calcs_done = True
def modal(self, context, event):
if event.type == 'TIMER' and not self._updating:
self._updating = True
self.do_calcs()
self._updating = False
if _calcs_done:
self.cancel(context)
return {'PASS_THROUGH'}
def execute(self, context):
context.window_manager.modal_handler_add(self)
self._updating = False
self._timer = context.window_manager.event_timer_add(0.5, context.window)
return {'RUNNING_MODAL'}
def cancel(self, context):
context.window_manager.event_timer_remove(self._timer)
self._timer = None
return {'CANCELLED'}
您必须自己处理正确的模块导入和操作员注册。
我有一个 Conways Game Of Life 模态运算符实现来展示如何使用它:https ://www.dropbox.com/s/b73idbwv7mw6vgc/gol.blend?dl=0
我建议您使用greenlets或spawn a new process。Greenlets 通常更容易使用,因为您不需要担心锁和竞争条件,但它们不能在所有情况下都使用。使用多进程或线程模块肯定会解决这个问题。