【发布时间】:2011-11-15 07:50:17
【问题描述】:
我制作了一个在 Manipulate 中运行良好的 progressIndicator。我点击一个按钮,该按钮调用了一个函数 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。
【问题讨论】: