Как запустить код инициализации для палитры?
Иногда было бы предпочтительно иметь некоторый код инициализации для палитр (кнопок). Например, он может определять некоторые функции, которые используются кнопками палитры.
Какой самый простой и предпочтительный способ определить / запустить код инициализации для палитры?
- Инициализация может выполняться либо при загрузке палитры, либо при первом нажатии любой кнопки (возможная проблема: что, если ядро перезапустится после загрузки палитры?)
- Определения должны быть как-то локализованы (то есть в их собственном контексте - помогают ли здесь уникальные контексты блокнота?)
- Если возможно, я бы предпочел решение с минимальными усилиями (то есть дополнительный код в наименьшем количестве возможных мест, автономный файл палитры без дополнительных файлов пакета, создание палитры с использованием существующих удобных инструментов меню палитр или
CreatePalette
, так далее.) - (Можно предположить, что код инициализации выполняется быстро, например, он состоит только из определений)
2 ответа
Вы правы, что беспокоитесь о видимости 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]]]]
Когда вы оцениваете это, обратите внимание, что Dynamic
в NotebookDynamicExpression
оценивает сразу. DynamicWrapper
никогда не оценивает, пока не откроет группу ячеек, что вы можете сделать, нажав на текст "Нажмите, чтобы открыть".
В этом примере, кстати, обратите внимание, что я завернул NotebookDynamicExpression
с Refresh
, Функция Refresh[#, None]&
убедитесь, что код оценивается только один раз - при первом открытии блокнота. В противном случае код будет подчиняться стандартным свойствам Dynamic
и оценивать всякий раз, когда изменяется любая из зависимостей.
NotebookDynamicExpression
был с v6, но был задокументирован только в v8. Также задокументированы родственные родственники, CellDynamicExpression
а также FrontEndDynamicExpression
,
DynamicBox
с Initialization
способен на основную функцию. Вы можете изменить размер палитры так, чтобы объект не был виден, и он все еще будет работать.
Вот код для небольшой примерной палитры. Он устанавливает значение для 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 *)