2011-09-12 12 views
2

私は、Manipulateの内部でうまく動作するprogressIndicatorを作った。ボタンをクリックすると、機能するfoo []が呼び出され、機能しているときに、progressIndicatorが関数の進行状況を動的に表示します。progressIndicator with Manipulate問題

しかし、私は、別のセルにそのコピーを作成するために操作表示のコピーを作成すると、最初の表示をクリックすると動作が停止し、コピーのprogressIndicatorが代わりに更新されます。

グローバルシンボルはありません。 progressIndicatorで使用される変数は、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[[email protected][{ 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*) 
    ] 
    ) 
] 

、およびカウンタをリセットするには、クリアボタンを押すと、最初の操作でボタンをもう一度実行すると、2番目のコピーの進捗インジケータが更新されていることがわかります。

共有シンボルが必要ですが、どこに表示されているのかわかりません。任意の助け

enter image description here

感謝。

更新1

[OK]を、私はDynamicModule追加[[操作し、{symbolsNamesHereを} ...]]

これは、スナップショット、今ProgresssIndicator作品間の '共有' の問題を解決すべてのコピーでOKです。

ただし、デモCDFは処理されません。ここでは、スクリーンショット

enter image description here

psです。私はこのエラーを理解していないので、WRIに電子メールを送ってください。 DownValuesを使用しないでください。

答えて

3

はたぶん、あなたは唯一の違いは、このコードでは、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[[email protected][{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*)]) 
] 

ような何かを試みることができますyを直接使用する代わりに、スコープの問題を解決する必要があります。Manipulateyを更新するには、foo[Unevaluated[y]]を使用します。

3

fooは共有シンボルです。 DynamicModule[{foo}, Manipulate[...]]を使用してローカライズすることができます。

更新

提示としてどうやら、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*) 
     ] 
    )  
+0

回答ありがとうございますが、わかりません。既にManipulateはDynamicModule自体です。私は常に多くのデモで操作の初期化セクションに多くの機能を持っていて、決して問題はありませんでした。さらに、デモはDynamicModule []ではなく、Manipulate []で始める必要があります。あなたは、ManipulateについてDynamicModuleを作成せずにこれを解決する方法を知っていますか?あなたは何かが共有されているという点で正しいですが、それを解決する理由と方法。繰り返しますが、前回の「初期化」セクションには常に機能がありましたが、問題は発生しませんでした。ありがとう。 – Nasser

+0

あなたの解決策は問題を解決しますが、私はそれを使うことができるかどうか分かりません。 WRIのデモプロジェクトで、これが問題ないかどうかを確認する必要があります。私はデモがマニピュレート[]から始める必要があるといつも理解していました。私はまだ初期化セクションの関数をすべて使用していたにもかかわらず、この問題が起きなかったのはなぜか非常に混乱しています。ありがとう! – Nasser

+0

こんにちはWReach、私はうまくいきませんでした。私は、DynamicModule []をManipulateの周りに追加し、必要なシンボルをローカライズしました。その後、問題は局所的に解決されましたが、CDFに処理しようとしたとき(つまりノートブックをデモサイトにアップロードしたとき)、ソフトウェアはそれを拒否しました。スクリーンショットをご覧ください。私はWRIの誰かにこれについて尋ねる電子メールを送る。 – Nasser