我有一个用于运行交互式程序的Shady脚本,该程序涉及多个具有多个动态属性的Stimulus对象。World本身也具有一些动态属性。
我需要一种方法来暂时停止交互式程序。我可以自己在附加到世界/刺激的自定义Animate回调中处理这种“暂停”状态,但在每个动态属性函数中处理它显然并不理想。有没有办法同时“暂停”和“取消暂停”所有的动态?最好,至少在暂停状态下的每个帧都会调用World.Animate回调(和所有事件处理程序),这样我就可以监控取消暂停的条件,并可能在暂停时做一些不同的事情。
发布于 2020-06-16 01:18:27
查看Shady.Rendering子模块中的_FrameCallback代码,似乎没有显示“运行动画回调,而不是动态属性评估”的全局标志。也没有正式的/有记录的途径来做到这一点。
但是,在逐个实例的基础上,有一种非官方的方法可以挂起动态:只需删除未记录的._dynamics属性,可能会将其存储在某个地方以便稍后恢复。对.Animate属性执行相同的操作以禁用动画回调。要一下子禁用这两种类型的动态,不如这样:
def ToggleDynamics(x):
x._disabled_dynamics, x._dynamics = x._dynamics, getattr(x, '_disabled_dynamics', {})
x._disabled_Animate, x.Animate = x.Animate, getattr(x, '_disabled_Animate', None)其中x是您的World或Stimulus实例。然后,要实现全局切换,您可以执行以下操作:
def ToggleDynamicsEverywhere(world):
for thing in [world] + list(world.stimuli.values()):
ToggleDynamics(thing)在python -m Shady shell showcase中尝试一下,您将看到ToggleDynamicsEverywhere(world)挂起了除视频播放之外的所有内容。
有一些相当明显的方法可以自定义这两个函数,以明确地启用/禁用动态而不是切换它们,或者在所有Stimulus实例上操作但不包括World,或者禁用,反之亦然。
https://stackoverflow.com/questions/62390875
复制相似问题