触发器可用于动画,但我无法找到改变代码中触发器状态的方法(即无需自己点击暂停或播放按钮)。
例如,假设我想进行模拟,当某些事件发生时,我想让当前活动的触发器进入PAUSE状态,当另一个事件发生时,我希望触发器进入PLAY状态。 / p>
执行此操作的按钮仍然存在,但我也希望能够从代码中更改这些按钮而无需实际操作。
原因是,我正在做一些动作,并且触发器处于播放模式,而我正在做这个其他动作是让事情无法正常工作。
所以我需要让它进入PAUSE状态,当我完成后,我可以将它设置回PLAY状态。
以下是我的意思的一个小例子:
Manipulate[
EventHandler[
Dynamic@Graphics[
{Circle[{0,0},1], Text[n,pt] },
PlotRange->All,ImageSize->200,ImagePadding->10],
{
"MouseDown":>
(
(* What to do here to cause the trigger to become Paused?"*)
pt=MousePosition["Graphics"]
),
"MouseDragged":>
(
(* while dragging, the trigger remains in PAUSED state "*)
Print["mouse dragged"];
pt=MousePosition["Graphics"]
),
"MouseUp":>
(
Print["MouseUp"]
(* What to do here to cause the trigger to Play again?"*)
)
}
],
Control[{{n,0,"Run"},0,100,0.01,
ControlType->Trigger, DisplayAllSteps->True, AnimationRate->1,
AppearanceElements->{"PlayPauseButton","ResetButton"}}
],
{{pt,{0,0}},ControlType->None}
]
在上面,当我在显示器上拖动鼠标时,我希望触发器变为PAUSED,以便显示的数字在被拖动时不会改变。完成拖动后,我可以根据需要再次触发PLAY。
所以,我的问题是:有没有办法在代码中改变上面的触发状态?
我可以根本不使用触发器,并以其他方式自己编码所有内容,但在放弃之前考虑问一下,因为触发器很方便使用。
这是指向触发器和按钮的更多文档的链接。
我发现最接近的是Enabled->触发选项,但这只会使触发器本身不启用,并且不会影响触发状态。即如果触发器被触发,即使我禁用它也会保持触发状态。
http://reference.wolfram.com/mathematica/ref/Manipulator.html
http://reference.wolfram.com/mathematica/ref/Trigger.html
感谢
答案 0 :(得分:3)
可能有一种更简单的方法可以做到这一点,但这似乎有效。通过创建计划任务并在按下或释放鼠标按钮或单击“播放/暂停”按钮时停止并启动它,它基本上模仿Trigger
。
DynamicModule[{start = 0, finish = 100, dt = 0.01, running = False, task, n},
n = start;
Manipulate[
EventHandler[
Dynamic@
Graphics[{Circle[{0, 0}, 1], Text[n, pt]}, PlotRange -> All,
ImageSize -> 200, ImagePadding -> 10],
{
"MouseDown" :>
(StopScheduledTask[task]; pt = MousePosition["Graphics"]),
"MouseDragged" :>
(Print["mouse dragged"]; pt = MousePosition["Graphics"]),
"MouseUp" :>
(If[running, StartScheduledTask[task]]; Print["MouseUp"])
}],
Control[Labeled[
Row[{
Button[
Dynamic@If[running, Magnify["\[DoubleVerticalBar]", 1.5],
Magnify["\[RightPointer]", 1.5]],
(If[running, running = False; StopScheduledTask[task],
running = True; StartScheduledTask[task]]),
Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False],
Button[
Magnify["\[FirstPage]", 1.5],
(n = start; ResetScheduledTask[task]),
Appearance -> "Palette", ImageSize -> 15, ContentPadding -> False]
}], "Run", Left]
],
{{pt, {0, 0}}, ControlType -> None}
],
Initialization :> (task =
CreateScheduledTask[n += dt, {dt, Floor[(finish - start)/dt]}]),
Deinitialization :> RemoveScheduledTask[task]
]
修改:更改了控件的外观,使其看起来更像传统的播放/暂停/重置按钮。