我制作了一个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上再次点击运行按钮,您将看到第二个副本的进度指示器现在正在更新,而不是第一个。
我必须有一些共享符号,但我不知道它在哪里。
感谢您的帮助。
更新1
好的,我添加了DynamicModule [{symbolsNamesHere},Manipulate [...]]
这解决了快照之间“共享”的问题,所以现在ProgresssIndicator在所有副本中都能正常工作。
但是没有处理演示CDF。这是屏幕截图
PS。发送电子邮件给WRI,因为我不明白这个错误。从未使用过DownValues。
答案 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]]
。