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

时间:2011-08-10 08:47:26

标签: wolfram-mathematica

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

例如,假设我想进行模拟,当某些事件发生时,我想让当前活动的触发器进入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

感谢

1 个答案:

答案 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]
]

修改:更改了控件的外观,使其看起来更像传统的播放/暂停/重置按钮。