如何运行调色板的初始化代码?

时间:2011-10-28 10:11:24

标签: wolfram-mathematica initialization mathematica-frontend

有时最好为调色板(按钮)设置一些初始化代码。例如,它可以定义调色板按钮使用的一些函数。

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

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

2 个答案:

答案 0 :(得分:10)

关注Dynamic是一个问题的可见性,你是对的。无论任何单个单元格的可见性如何,绝对保证评估Dynamic表达式的方法是使用NotebookDynamicExpression。这是一个示例,说明NotebookDynamicExpressionDynamic失败时工作,因为它隐藏在一个封闭的单元格组中:

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

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

在此示例中,顺便提一下,请注意我将NotebookDynamicExpressionRefresh包裹在一起。函数Refresh[#, None]&将确保代码仅评估一次 - 首次打开笔记本时。否则,代码将遵循Dynamic的标准属性,并在任何依赖项发生更改时进行评估。

NotebookDynamicExpression自v6以来一直存在,但仅在v8中记录。还记录了其相关堂兄CellDynamicExpressionFrontEndDynamicExpression

答案 1 :(得分:4)

具有DynamicBox的{​​{1}}能够执行基本功能。您可以调整调色板的大小,使对象不可见,并且它仍然可以运行。

这是一个小样本调色板的代码。它为Initialization设置了一个值。活动代码用空格偏移。

var