Wolfram mathematica progressIndicator与操纵问题一起使用
我制作了一个进度指示器,它在内部运行良好。我单击一个按钮,它调用一个函数foo[],该函数确实起作用,当它起作用时,progressIndicator动态显示该函数正在取得的进展 但是,当我复制一个显示本身以在另一个单元格中创建它的副本时,现在单击第一个显示将停止工作,而副本中的progressIndicator将更新 我没有全球符号。progressIndicator中使用的变量位于操作内部 有人知道如何解决这个问题吗?这是一个问题,因为在制作演示时,必须在笔记本上的几个地方复制操作本身(制作一些快照),因此不允许使用全局变量,否则会出现问题 我举了一个小例子来说明这个问题:Wolfram mathematica progressIndicator与操纵问题一起使用,wolfram-mathematica,Wolfram Mathematica,我制作了一个进度指示器,它在内部运行良好。我单击一个按钮,它调用一个函数foo[],该函数确实起作用,当它起作用时,progressIndicator动态显示该函数正在取得的进展 但是,当我复制一个显示本身以在另一个单元格中创建它的副本时,现在单击第一个显示将停止工作,而副本中的progressIndicator将更新 我没有全球符号。progressIndicator中使用的变量位于操作内部 有人知道如何解决这个问题吗?这是一个问题,因为在制作演示时,必须在笔记本上的几个地方复制操作本身(制作
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*)
]
)
]
运行上述操作后,如果将操纵显示本身复制到一个新的空单元格中,然后单击“清除”按钮重置计数器,然后在第一次操纵时再次单击“运行”按钮,您将看到第二次复制的进度指示器现在正在更新,而不是第一次
我必须在那里有一些共享的符号,但我看不出在哪里
谢谢你的帮助
更新1
好的,我添加了DynamicModule[{symbolsNamesHere},操纵[…]
这解决了快照之间的“共享”问题,因此现在ProgressIndicator在所有副本中都可以正常工作
但未处理演示CDF。这是屏幕截图
请发送电子邮件给WRI,因为我不理解这个错误。从不使用下行值。
foo
是共享符号。您可以使用DynamicModule[{foo},operate[…]]
对其进行本地化
更新
显然,Wolfram演示不会接受所呈现的构造。作为一种解决办法,也许这会起作用:
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*)
]
)
操纵[
(* ... *)
{{y,0},无},
{foo,None},(*
(
foo=.;(*也许你可以试试类似的东西
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
,您将使用foo[Unevaluated[y]]
谢谢你的回答,但我不明白。操纵本身就是一个动态模块。在许多演示中,操纵的初始化部分我总是有很多函数,从来没有遇到过问题。此外,演示需要从操纵[]开始,而不是从动态模块[]开始。你知道如何解决这个问题而不在Operation周围创建DynamicModule吗?你说得对,有些东西是共享的,但为什么以及如何解决它。再说一遍,我以前在初始化部分中总是有函数,它从来没有引起过问题,为什么是现在?谢谢。你的解决方案确实解决了问题,我只是不确定现在我是否可以使用它。I n我需要在演示项目中与WRI的人核实一下,看看这是否合适。我一直都明白演示必须从操纵[]开始。我仍然很困惑,为什么我以前从未出现过这个问题,尽管我一直在使用初始化部分中的函数。谢谢!你好,花环,恐怕它不起作用。我添加了DynamicModule[]然后问题就在本地解决了,但当我试图将它处理到CDF(即将笔记本上传到演示站点)时,软件拒绝了它。请看屏幕截图。我还向WRI的某人发送了电子邮件,询问此事。我不熟悉演示限制,但我已在我的回复中添加了一个解决方案,这可能会奏效。我尝试了你的第二个解决方案。它在本地与以前一样工作正常,但无论何时我上传它,我都会得到相同的结果显示DownValues符号时出错。每当我添加您用{foo,None}显示的技巧时,它就会出现。我认为它不喜欢有一个功能符号。当我删除它时,它会上传OK,但与progressIndicator的冲突又回来了。这就是一个符号的问题。奇怪。我把笔记本发送给WRI,让人看看为什么会出现这个符号。软件对演示站点的笔记本进行处理非常严格。