8

有时最好有一些用于(按钮的)调色板的初始化代码。例如,它可以定义一些调色板按钮使用的功能。

为调色板定义/运行初始化代码的最简单和更可取的方法是什么?

  • 初始化可以在加载调色板或第一次按下任何按钮时运行(可能的问题:如果在加载调色板后重新启动内核怎么办?)
  • 定义应该以某种方式本地化(即在它们自己的上下文中——独特的笔记本上下文在这里有帮助吗?)
  • 如果可能的话,我更喜欢一个省力的解决方案(即在尽可能少的地方添加额外的代码,没有额外的包文件的自包含调色板文件,使用现有的调色板菜单或调色板CreatePalette等便利工具创建调色板)
  • (您可以假设初始化代码运行得很快,例如它只包含定义)
4

2 回答 2

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

当您对此进行评估时,请注意DynamicinNotebookDynamicExpression立即评估。在DynamicWrapper您打开单元组之前,永远不会进行评估,您可以通过单击“单击以打开”文本来执行此操作。

在这个例子中,顺便提一下,我用 包裹NotebookDynamicExpressionRefresh。该函数Refresh[#, None]&将确保代码只计算一次——在第一次打开笔记本时。否则,代码将遵循标准属性,Dynamic并在任何依赖项发生更改时进行评估。

NotebookDynamicExpression自 v6 以来一直存在,但仅在 v8 中记录。还记录了它的相关表亲,CellDynamicExpressionFrontEndDynamicExpression.

于 2011-12-02T08:34:34.887 回答
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 *)
于 2011-10-28T10:38:01.860 回答