【问题标题】:progressIndicator use with Manipulate problemprogressIndicator 与 Manipulate 问题一起使用
【发布时间】: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。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    也许你可以尝试类似的东西

    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,这应该可以解决您遇到的范围问题。要在Manipulate 中更新y,您可以使用foo[Unevaluated[y]]

    【讨论】:

      【解决方案2】:

      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*)
            ]
          )      
      

      【讨论】:

      • 感谢您的回答,但我不明白。 Manipulate 本身就是一个 DynamicModule。在许多演示中,我一直在 Manipulate 的初始化部分有很多函数,从来没有遇到过问题。此外,演示需要以 Manipulate[] 开头,而不是 DynamicModule[]。你知道如何在不围绕 Manipulate 创建 DynamicModule 的情况下解决这个问题吗?你是对的,有些东西是共享的,但是为什么以及如何解决它。再说一次,我以前总是在初始化部分有函数,它从来没有引起问题,为什么现在呢?谢谢。
      • 您的解决方案确实解决了问题,我只是不确定现在是否可以使用它。我需要在演示项目中与 WRI 的某个人核实一下,看看这是否可以。我一直明白,演示必须以 Manipulate[] 开头。即使我一直在初始化部分使用函数,我也仍然很困惑为什么我之前从未出现过这个问题。谢谢!
      • 你好WReach,恐怕它没有工作。我在 Manipulate 周围添加了 DynamicModule[],并本地化了所需的符号。然后问题在本地消失了,但是当我尝试将其处理到 CDF 时(即将笔记本上传到演示站点),软件拒绝了它。请看屏幕截图。我还向世界资源研究所的某个人发送电子邮件询问此事。
      • 我不熟悉 Demonstrations 限制,但我在我的回复中添加了一个变通办法,可能会奏效。
      • 我尝试了您的第二个解决方案。它确实像以前一样在本地工作,但同样,每当我上传它时,我都会收到与 DownValues 符号显示相同的错误。每当我添加您使用 {foo,None} 展示的技巧时,它就会出现。我认为它不喜欢那里的功能符号。当我删除它时,它上传正常,但与 progressIndicator 的冲突又回来了。这就是问题所在。奇怪的。我把笔记本寄给世界资源研究所,让别人看看为什么会出现这个符号。用于演示站点的笔记本处理软件非常严格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2013-05-12
      • 2016-04-06
      • 2021-10-06
      • 2015-05-29
      • 2015-01-28
      • 2019-04-12
      相关资源
      最近更新 更多