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

Wolfram mathematica 如何运行调色板的初始化代码?,wolfram-mathematica,initialization,mathematica-frontend,Wolfram Mathematica,Initialization,Mathematica Frontend,有时,最好为选项板(按钮)提供一些初始化代码。例如,它可以定义调色板按钮使用的一些函数 为调色板定义/运行初始化代码的最简单、最好的方法是什么? 初始化可以在加载调色板时运行,也可以在第一次按下任何按钮时运行(可能的问题:如果加载调色板后重新启动内核会怎么样?) 这些定义应该以某种方式本地化(即在它们自己的上下文中——独特的笔记本上下文在这里有用吗?) 如果可能的话,我更喜欢最省力的解决方案(即,在尽可能少的位置添加额外的代码,不包含额外包文件的自包含调色板文件,使用调色板菜单或CreateP

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

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

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

A
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 *)
(*笔记本内容的开头*)
记事本[{
单元格[BoxData][{
标记框[网格框][{
{
按钮盒[“\”,
外观->自动,
按钮功能:>无,
计算器->自动,
方法->“抢占式”]},
{
按钮盒[“\”,
外观->自动,
按钮功能:>无,
计算器->自动,
方法->“抢占式”]},
{
按钮盒[“\”,
外观->自动,
按钮功能:>无,
计算器->自动,
方法->“抢占式”]}
},
GridBoxAlignment->{“列”->{{{Left}}},
GridBoxItemSize->{“列”->{{Automatic}},行”->{{Automatic}}],
“列”],“\[缩进换行符]”,
DynamicBox[Null,
初始化:>($CellContext`var=“完成了,主控。”)
]
}],NotebookDefault,
单元格边距->{0,0},{0,0},
CellBracketOptions->{“Color”->RGBColor[0.269993,0.308507,0.6]},
CellHorizontalScrolling->True,
pagebreakover->True,
PageBreakWithin->False,
ShowAutoStyles->True,
行距->{1.25,0},
自动斜体字->{},
脚本大小->9,
ShowStringCharacters->False,
FontFamily:>CurrentValue[“PanelFontFamily”],
FontSize:>CurrentValue[“PanelFontSize”]]
},
WindowsSize->{55105},
窗口边距->{Automatic,583},{Automatic,292},
WindowFrame->“调色板”,
WindowElements->{},
WindowFrameElements->{“CloseBox”、“MinimizeBox”},
StyleDefinitions->“Palette.nb”
]
(*笔记本内容结束*)

您担心
动态的可见性是一个问题,这是对的。无论任何单个单元格的可见性如何,绝对保证要计算
动态
表达式的方法是使用
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]]]]
计算此值时,请注意
NotebookDynamicExpression
中的
Dynamic
会立即计算。在打开单元格组之前,
DynamicWrapper
不会计算,您可以通过单击“单击打开”文本来完成此操作

在本例中,顺便注意,我用
Refresh
包装了
NotebookDynamicExpression
。函数
Refresh[#,None]&
将确保代码仅在笔记本首次打开时计算一次。否则,代码将遵循
Dynamic
的标准属性,并在任何依赖项更改时进行计算


NotebookDynamicExpression
从v6开始出现,但仅在v8中有文档记录。还记录了它的近亲,
CellDynamicExpression
frontendynamicexpression

嘿,那是什么调色板D我的问题是:您确定即使
DynamicBox
不可见,初始化代码也会执行吗?这里的情况似乎不是这样。(但这不是一个大问题,我认为我仍然可以使用这种方法。)我制作了一个末尾带有DynamicBox的笔记本(打开笔记本时不可见)。重新启动Mathematica并重新打开笔记本后,未执行初始化。(它是在我滚动到最后之后执行的。)只是指出这一点。否则我可以使用这种方法,而这在实践中对我来说不是问题。@Szabolcs(#1)我非常喜欢这种调色板。:-)(#2)奇怪的是,我特别检查了这一点,因为我知道动态对象在隐藏时是不活动的,我发现它是有效的。可能是因为在我的系统中,对于示例笔记本,它只是刚出帧?@Mr.Wizard,尽管它可能存在一些问题(例如双重或延迟初始化),但它似乎对我遇到的有点受限的用例有效。@Mr.Wizard请参阅此处,了解一个可能的问题:欢迎(返回)StackOverflow,并感谢您使用asnwer!很高兴终于在这里见到你。如果您有时间,也许您还可以看看这个与前端相关的问题:首先评估什么,*DynamicExpression还是visible dynamic?还是这是一场激烈的竞争?