8

偶爾會有一些調色板(按鈕)的初始化代碼。例如,它可以定義調色板按鈕使用的一些功能。如何運行調色板的初始化代碼?

什麼是定義一個調色板/運行初始化代碼的最簡單,最好的方法?

  • 初始化可以運行在調色板加載或當按下首次任何按鈕(可能的問題:怎麼辦?如果內核重啓調色板加載後)
  • 的定義應該得到某種局部的(即在自己的語境 - 做獨特的筆記本上下文幫助嗎?)
  • 如果可能的話,我寧願一個最小的代價解決方案在儘可能少的地方(即額外的代碼,以自包含的調色板文件無需額外的軟件包文件,使用調色板菜單或的現有便利工具創建調色板等)
  • (您可以假定初始化代碼運行得很快,例如,它僅由定義組成)
+1

+1有趣的問題 –

+0

@ Mr.Wizard儘管出現了一些問題,它可能有(例如雙或延遲初始化),它似乎已經工作了一定的限制使用情況下,我有。 – Szabolcs

+0

@ Mr.Wizard看到這裏可能出現的問題:https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/n-lh8sc83Qs/discussion – Szabolcs

回答

10

您是否正確關注Dynamic是一個問題的可見性。要絕對保證Dynamic表達式被評估的方式,而不管任何單個單元的可見性是使用NotebookDynamicExpression。下面是說明NotebookDynamicExpression工作的例子,同時,因爲它是一個封閉小區組內隱藏着一個Dynamic失敗:

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立即評估。 DynamicWrapper從未評估,直到您打開單元組,您可以通過單擊「單擊以打開」文本來完成。

在這個例子中,順便說一句,請注意,我包裹NotebookDynamicExpressionRefresh。功能Refresh[#, None]&將確保代碼僅評估一次 - 筆記本首次打開時。否則,代碼將服從Dynamic的標準屬性,並在任何依賴關係發生更改時進行評估。

NotebookDynamicExpression已自V6,但只在V8記錄。還記錄了它的相關表親,CellDynamicExpressionFrontEndDynamicExpression

+1

歡迎(返回)到StackOverflow,並感謝您的關注!很高興終於在這裏見到你。如果你有時間,也許你也可以看看這個前端相關的問題:http://stackoverflow.com/questions/8353838/controlling-the-rasterize-width-for-notebook-related-expression – Szabolcs

+0

什麼將首先評估,* DynamicExpression或可見的動態?或者這是一場老鼠賽? – Kuba

4

A 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)奇怪,我特別檢查了一下,知道動態對象在隱藏時處於非活動狀態,並且我發現它工作正常。也許是因爲在我的系統上,使用樣本筆記本,它只是*失去了框架? –