Wolfram mathematica progressIndicator与操纵问题一起使用

Wolfram mathematica progressIndicator与操纵问题一起使用,wolfram-mathematica,Wolfram Mathematica,我制作了一个进度指示器,它在内部运行良好。我单击一个按钮,它调用一个函数foo[],该函数确实起作用,当它起作用时,progressIndicator动态显示该函数正在取得的进展 但是,当我复制一个显示本身以在另一个单元格中创建它的副本时,现在单击第一个显示将停止工作,而副本中的progressIndicator将更新 我没有全球符号。progressIndicator中使用的变量位于操作内部 有人知道如何解决这个问题吗?这是一个问题,因为在制作演示时,必须在笔记本上的几个地方复制操作本身(制作

我制作了一个进度指示器,它在内部运行良好。我单击一个按钮,它调用一个函数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,让人看看为什么会出现这个符号。软件对演示站点的笔记本进行处理非常严格。