progressIndicator与Manipulate问题一起使用

时间:2011-09-12 12:42:17

标签: wolfram-mathematica

我制作了一个progressIndicator,在Manipulate中运行得很好。我单击一个按钮,它调用一个功能foo [],它可以正常工作,并且在工作时,progressIndicator动态显示函数正在进行的进度。

但是当我制作Manipulate显示本身的副本以在另一个单元格中创建它的副本时,现在点击第一个显示停止工作,副本中的progressIndicator是更新的。

我没有全球符号。 progressIndicator中使用的变量位于Manipulate内。

有人知道如何解决这个问题吗?这是一个问题,因为在制作演示时,必须在少数几个地方制作Manipulate本身的副本(制作一些快照),因此不允许使用全局变量,否则会出现问题。

我做了一个小例子来说明问题:

Manipulate[
 x,
 Grid[{
   {Control[{{x, 0, "x="}, 0, 1, .1}], SpanFromLeft},

   {Button[Text[Style["run", 11]], {y = 0; foo[]}, ImageSize -> 100, 
     Method -> "Queued"],
    Button[Text[Style["clear", 11]], y = 0, ImageSize -> 100]},

   {Dynamic[ProgressIndicator[y, {0, 1}, ImageSize -> 100]]},
   {Dynamic[Text@Row[{ Style[ y*100 , 11], Style["%", 11]}]]}
   }, Spacings -> {0, .3}],

 {{y, 0}, None},

 TrackedSymbols :> {x}, (*does nothing, just for testing *)

 SynchronousUpdating -> False,
 SynchronousInitialization -> False,
 Initialization :>
  (
   foo[] := Module[{i},
     Do[Pause[.15]; y = i, {i, 0, 1, .1}] (*Pause[] to slow it down*)
     ]
   )
 ]

运行上述操作后,如果将Manipulate显示本身复制到新的空单元格,然后点击清除按钮重置计数器,然后在第一个Manipulate上再次点击运行按钮,您将看到第二个副本的进度指示器现在正在更新,而不是第一个。

我必须有一些共享符号,但我不知道它在哪里。

enter image description here

感谢您的帮助。

更新1

好的,我添加了DynamicModule [{symbolsNamesHere},Manipulate [...]]

这解决了快照之间“共享”的问题,所以现在ProgresssIndicator在所有副本中都能正常工作。

但是没有处理演示CDF。这是屏幕截图

enter image description here

PS。发送电子邮件给WRI,因为我不明白这个错误。从未使用过DownValues。

2 个答案:

答案 0 :(得分:3)

foo是共享符号。您可以使用DynamicModule[{foo}, Manipulate[...]]进行本地化。

<强>更新

显然,Wolfram Demonstrations不接受所提出的结构。作为一种解决方案,也许这将起作用:

Manipulate[
    (* ... *)
    {{y, 0}, None},
    {foo, None}, (* <-- added an empty manipulator for foo *)
    (* ... *)
    Initialization :>
    (
      foo =.; (* <-- unbind foo before defining it *)
      foo[] := Module[{i},
        Do[Pause[.15]; y = i, {i, 0, 1, .1}] (*Pause[] to slow it down*)
      ]
    )      

答案 1 :(得分:3)

也许你可以尝试像

这样的东西
Manipulate[x, 
 Grid[{
    {Control[{{x, 0, "x="}, 0, 1, .1}], SpanFromLeft}, 

    {Button[Text[Style["run", 11]], {y = 0; foo[Unevaluated[y]]}, 
      ImageSize -> 100, Method -> "Queued"],
     Button[Text[Style["clear", 11]], y = 0, 
      ImageSize -> 100]}, 

    {Dynamic[ProgressIndicator[y, {0, 1}, ImageSize -> 100]]}, 

    {Dynamic[Text@Row[{Style[y*100, 11], Style["%", 11]}]]}}, 
  Spacings -> {0, .3}],

 {{y, 0}, None}, 

 TrackedSymbols :> {x, y},(*does nothing,just for testing*)
 SynchronousUpdating -> False, SynchronousInitialization -> False, 
 Initialization :> (foo[a_] := 
    Module[{i}, 
      Do[Pause[.15]; a = i, {i, 0, 1, .1}] (*Pause[] to slow it down*)])
]

唯一的区别是,在此代码中,foo被定义为参数的函数,而不是直接使用y,这应该可以解决您遇到的范围问题。要更新y中的Manipulate,您需要使用foo[Unevaluated[y]]