パレットの初期化コードを実行するには?

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

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

  • 初期化は、パレットがロードされたとき、または最初にボタンが押されたとき(可能な問題:パレットをロードした後にカーネルを再起動するとどうなるでしょうか?)
  • >
  • 定義は何らかの形でローカライズされていなければなりません(独自のコンテキストでは、独自のノートブックコンテキストが役立ちますか?)
  • 可能であれば、私は最小限の労力を要するソリューション(つまり、できるだけ余分な場所にコードを追加し、余分なパッケージファイルを持たない自己完結型パレットファイル、パレットメニューの既存の便利ツールを使用するパレット作成、または CreatePalette など)
  • (初期化コードが高速で実行されていると想定できます(例:定義のみで構成されている場合)
8
@ Mr.Wizardそれはいくつかの問題があるかもしれないが(例えば、二重または遅れた初期化)、私は幾分制限されたユースケースのために働いたようだ。
追加された 著者 Szabolcs,
@ Mr.Wizard考えられる問題については、こちらをご覧ください。 groups.google.com/d/topic/comp.soft-sys.math.mathematica/&hellip
追加された 著者 Szabolcs,
+1の良い質問
追加された 著者 Mr.Wizard,

2 答え

問題となる動的の可視性について心配するのは正しいです。 NotebookDynamicExpression を使用して、個々のセルの表示の有無にかかわらず、動的式を評価する方法を絶対に保証する方法です。 NotebookDynamicExpression が閉じたセルグループ内に隠れているために 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]]]]

これを評価すると、 NotebookDynamicExpression 動的が直ちに評価されることに注意してください。 DynamicWrapper はセルグループを開くまで評価されません。セルグループを開くには、 "Click to open"テキストをクリックします。

In this example, incidentally, notice that I wrapped the NotebookDynamicExpression with Refresh. The function Refresh[#, None]& will make sure that the code evaluates only once -- when the notebook is first opened. Otherwise, the code would obey the standard properties of Dynamic and evaluate whenever any of the dependencies change.

NotebookDynamicExpression has been around since v6, but was only documented in v8. Also documented are its related cousins, CellDynamicExpression and FrontEndDynamicExpression.

10
追加された
StackOverflowへようこそ(バック)、asnwerありがとう!ようやくここでお会いできたらうれしいです。時間がある場合は、このフロントエンド関連の質問を見ることもできます。 stackoverflow.com/questions/8353838/…
追加された 著者 Szabolcs,
最初に評価するものは何ですか?DynamicExpressionか可視のダイナミック?それともこれはラットレースですか?
追加された 著者 Kuba,

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

小さなサンプルパレットのコードです。 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 *)
4
追加された
名前:ねえ、どのようなパレットですか? :D私の質問は、 DynamicBox が表示されていなくても初期化コードが実行されることを確認してくださいですか?これはここではそうではないようです。 (しかし、それは大きな問題ではない、私はまだこのアプローチを使用することができると思う)。
追加された 著者 Szabolcs,
私は最後にDynamicBoxを持ったノートを作った(ノートブックを開くときは見えない)。 Mathematicaを再起動してノートブックを開いた後、初期化は実行されなかった。 (私が最後までスクロールした後に実行されたのは でした)。これを指摘してください。それ以外の場合は、私はこのアプローチを使用することができますが、これは実際問題ではありません。
追加された 著者 Szabolcs,
@Szabolcs(#1)私はそのパレットが大好きです。 :-)(#2)奇妙なことに、私は具体的には、動的オブジェクトが非表示のときは非アクティブであることを知りました。おそらく私のシステムでは、サンプルのノートブックでは、それはちょうどの枠外ですか?
追加された 著者 Mr.Wizard,