8

場合によっては、(ボタンの)パレットの初期化コードを持つことが望ましいでしょう。たとえば、パレットボタンで使用されるいくつかの関数を定義できます。パレットの初期化コードを実行するには?

パレットの初期化コードを定義/実行する最も簡単で好ましい方法は何ですか?

  • パレットがロードされたとき、またはいずれかのボタンが最初に押されたときに初期化がいずれかを実行することができます(可能問題:?パレットがロードされた後、カーネルを再起動した場合はどう
  • 可能であれば、最小限の労力を要するソリューション(可能な限り最小限の場所で余分なコードを追加することをお勧めします。自己完結型のパレットファイルを使用することをお勧めします。余分なパッケージファイル、パレットメニューの既存の便利ツール、またはを使用したパレット作成など)
  • (初期化コードが高速で実行されると想定できます。定義のみで構成されています)
+1

+1 nice question –

+0

@ Mr.Wizard若干制限されている場合があります(初期化が2倍または遅れているなど)。 – Szabolcs

+0

@ Mr.Wizard考えられる問題については、こちらをご覧ください。https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/n-lh8sc83Qs/discussion – Szabolcs

答えて

10

あなたはDynamicが問題であることの可視性を心配する権利です。 Dynamicの式が、個々のセルのいずれかの可視性に関係なく評価されることを絶対的に保証する方法は、NotebookDynamicExpressionを使用することです。あなたはこれを評価すると

cell1 = First @ MakeBoxes[ 
    TextCell["Click to open", "Title", 
     CellMargins -> 0, System`WholeCellGroupOpener -> True], 
    StandardForm]; 
cell2 = First @ MakeBoxes[ 
    ExpressionCell[DynamicWrapper["hidden cell", Print["DynamicWrapper"]]], 
    StandardForm]; 
CreatePalette[ 
    Notebook[{Cell[CellGroupData[{cell1, cell2}, Closed]]}, 
     NotebookDynamicExpression :> 
      Dynamic[Refresh[Print["NotebookDynamicExpression"], None]]]] 

NotebookDynamicExpressionDynamicがすぐに評価されていることに注意してください:ここでは、クローズドセルグループ内に隠されているためDynamicが失敗しながら作業NotebookDynamicExpressionを示している例です。 DynamicWrapperは、セルグループを開くまで評価されません。セルグループを開くには、「クリックして開く」テキストをクリックします。

この例では、ちょっと私がRefreshNotebookDynamicExpressionをラップしたことに注目してください。関数Refresh[#, None]&は、ノートブックを最初に開いたときにコードが1回だけ評価されることを確認します。それ以外の場合、コードはDynamicの標準プロパティーに従い、いずれかの依存関係が変更されるたびに評価します。

NotebookDynamicExpressionは、v6以降で使用されていましたが、v8でのみ文書化されています。また、関連する従兄弟であるCellDynamicExpressionFrontEndDynamicExpressionも文書化されています。

+1

StackOverflowへようこそ(バック)、asnwerありがとう!ようやくここでお会いできたらうれしいです。時間がある場合は、このフロントエンド関連の質問を見ることもできます:http://stackoverflow.com/questions/8353838/controlling-the-rasterize-width-for-notebook-related-expression – Szabolcs

+0

* DynamicExpressionか可視のダイナミック?それともこれはラットレースですか? – Kuba

4

DynamicBoxInitializationは基本機能があります。オブジェクトが表示されないようにパレットのサイズを変更することができます。

ここに小さなサンプルパレットのコードです。 varの値を設定します。アクティブなコードは空白でオフセットされています。

(* Beginning of Notebook Content *) 
Notebook[{ 
Cell[BoxData[{ 
TagBox[GridBox[{ 
    { 
    ButtonBox["\<\"TSV\"\>", 
     Appearance->Automatic, 
     ButtonFunction:>None, 
     Evaluator->Automatic, 
     Method->"Preemptive"]}, 
    { 
    ButtonBox["\<\"CSV\"\>", 
     Appearance->Automatic, 
     ButtonFunction:>None, 
     Evaluator->Automatic, 
     Method->"Preemptive"]}, 
    { 
    ButtonBox["\<\"Table\"\>", 
     Appearance->Automatic, 
     ButtonFunction:>None, 
     Evaluator->Automatic, 
     Method->"Preemptive"]} 
    }, 
    GridBoxAlignment->{"Columns" -> {{Left}}}, 
    GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}], 
    "Column"], "\[IndentingNewLine]", 

DynamicBox[Null, 
    Initialization :> ($CellContext`var = "It is done, Master.") 
] 

}], NotebookDefault, 
CellMargins->{{0, 0}, {0, 0}}, 
CellBracketOptions->{"Color"->RGBColor[0.269993, 0.308507, 0.6]}, 
CellHorizontalScrolling->True, 
PageBreakAbove->True, 
PageBreakWithin->False, 
ShowAutoStyles->True, 
LineSpacing->{1.25, 0}, 
AutoItalicWords->{}, 
ScriptMinSize->9, 
ShowStringCharacters->False, 
FontFamily:>CurrentValue["PanelFontFamily"], 
FontSize:>CurrentValue["PanelFontSize"]] 
}, 
WindowSize->{55, 105}, 
WindowMargins->{{Automatic, 583}, {Automatic, 292}}, 
WindowFrame->"Palette", 
WindowElements->{}, 
WindowFrameElements->{"CloseBox", "MinimizeBox"}, 
StyleDefinitions->"Palette.nb" 
] 
(* End of Notebook Content *) 
+0

ねえ、パレットは何ですか? :D私の質問は、「DynamicBox」が表示されていなくても、初期化コードが*実行されることを確信していますか?これはここではそうではないようです。 (しかしそれは大きな問題ではない、私はまだこのアプローチを使うことができると思う。) – Szabolcs

+0

私は最後にDynamicBoxを持ったノートを作った。 Mathematicaを再起動してノートブックを開いた後、初期化は実行されなかった。 (私は最後までスクロールした後に*実行されました。)これを指摘してください。それ以外の場合は、私はこのアプローチを使用することができますが、これは実際問題ではありません。 – Szabolcs

+0

@Szabolcs(#1)私はそのパレットが大好きです。 :-)(#2)奇妙なことに、私は具体的には、動的オブジェクトが非表示のときは非アクティブであることを知りました。おそらく、私のシステムでは、サンプルのノートブックでは、それはただのフレーム外ですか? –

関連する問題