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

Sza*_*lcs 8 wolfram-mathematica initialization mathematica-frontend

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

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

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

Joh*_*ltz 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]]]]
Run Code Online (Sandbox Code Playgroud)

评估时,请注意Dynamicin in NotebookDynamicExpression立即评估.在DynamicWrapper您打开单元格组之前永远不会进行评估,您可以通过单击"单击以打开"文本来执行此操作.

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

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