Как запустить код инициализации для палитры?

Иногда было бы предпочтительно иметь некоторый код инициализации для палитр (кнопок). Например, он может определять некоторые функции, которые используются кнопками палитры.

Какой самый простой и предпочтительный способ определить / запустить код инициализации для палитры?

  • Инициализация может выполняться либо при загрузке палитры, либо при первом нажатии любой кнопки (возможная проблема: что, если ядро ​​перезапустится после загрузки палитры?)
  • Определения должны быть как-то локализованы (то есть в их собственном контексте - помогают ли здесь уникальные контексты блокнота?)
  • Если возможно, я бы предпочел решение с минимальными усилиями (то есть дополнительный код в наименьшем количестве возможных мест, автономный файл палитры без дополнительных файлов пакета, создание палитры с использованием существующих удобных инструментов меню палитр или 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 *)
Другие вопросы по тегам