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