如何使用代码(而不仅仅是按钮)控制触发状态(暂停,播放)



触发器用于动画是有用的,但我无法找到一种方法来改变代码中的触发器状态(即无需点击暂停或播放按钮)。

例如,假设我想做一个模拟,当一些事件发生时,我想让当前活动的触发器进入暂停状态,当另一个事件发生时,我想让触发器进入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}
]

在上面,当我在显示器上拖动鼠标时,我希望触发器暂停,以便在拖动时显示的数字不会改变。当拖动完成后,如果需要的话,我可以让触发器再次播放。

所以,我的问题是:有没有一种方法来改变触发状态,就像上面的代码?

我当然可以完全不使用trigger,并以其他方式自己编写所有内容,但在我放弃之前想问一下,因为trigger使用起来很方便。

这里是一个链接到更多的文档的触发器和按钮。

我发现最接近的东西是Enabled->选项来触发,但这只是使触发器本身被启用为不,而不影响触发状态。即,如果触发器正在触发,它将保持触发,即使我设置为禁用。

http://reference.wolfram.com/mathematica/ref/Manipulator.html

http://reference.wolfram.com/mathematica/ref/Trigger.html

谢谢

可能有一种更简单的方法来做到这一点,但这似乎有效。它基本上通过创建一个计划任务来模仿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]
]

编辑:改变控件的外观,使它们看起来更像传统的播放/暂停/重置按钮

最新更新