8

Ocasionalmente, sería preferible tener algún código de inicialización para paletas (de botones). Por ejemplo, podría definir algunas funciones que usan los botones de la paleta.¿Cómo ejecutar el código de inicialización para una paleta?

¿Cuál es la forma más fácil y preferible de definir/ejecutar el código de inicialización para una paleta?

  • La inicialización puede funcionar bien cuando la paleta se carga o cuando se pulsa cualquier botón por primera vez (posible problema:? lo que si se reinicia el núcleo después de la paleta se cargó)
  • El las definiciones deben estar de alguna manera localizadas (es decir, en su propio contexto: ¿aquí ayudan los contextos únicos del cuaderno?)
  • Si es posible, preferiría una solución de mínimo esfuerzo (es decir, código adicional en el menor número de lugares posible, archivo de paleta autónomo con sin archivos de paquete adicionales, creación de paleta utilizando las herramientas de conveniencia existentes del menú de paletas o CreatePalette, etc.)
  • (Puede suponer que el código de inicialización se ejecuta rápidamente, p. consiste solo de definiciones)
+1

+1 buena pregunta –

+0

@ Mr.Wizard A pesar de algunos problemas que podría tener (por ejemplo, la inicialización doble o diferida), parece haber funcionado para el caso de uso algo restringido que tengo. – Szabolcs

+0

@ Mr.Wizard Consulte aquí para ver un posible problema: https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/n-lh8sc83Qs/discussion – Szabolcs

Respuesta

10

Tienes razón para estar preocupados por la visibilidad de la Dynamic siendo un problema. La forma de garantizar por completo una expresión Dynamic que se evaluará independientemente de la visibilidad de cualquiera de las celdas individuales es usar NotebookDynamicExpression. Aquí hay un ejemplo que ilustra NotebookDynamicExpression de trabajo mientras que un Dynamic falla porque está escondida dentro de un grupo de celdas cerradas:

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]]]] 

Al evaluar esto, observamos que el Dynamic en NotebookDynamicExpression evalúa inmediatamente. El DynamicWrapper nunca se evalúa hasta que abra el grupo de celdas, lo que puede hacer haciendo clic en el texto "Haga clic para abrir".

En este ejemplo, por cierto, observe que envolví el NotebookDynamicExpression con Refresh. La función Refresh[#, None]& se asegurará de que el código evalúe solo una vez, cuando se abre por primera vez el notebook. De lo contrario, el código obedecería a las propiedades estándar de Dynamic y evaluaría cada vez que cambie alguna de las dependencias.

NotebookDynamicExpression ha estado presente desde v6, pero solo se documentó en v8. También están documentados sus primos relacionados, CellDynamicExpression y FrontEndDynamicExpression.

+1

¡Bienvenido (atras) a StackOverflow, y gracias por la respuesta! Es bueno finalmente verte aquí. Si tiene tiempo, quizás también pueda echarle un vistazo a esta pregunta relacionada con el front-end: http://stackoverflow.com/questions/8353838/controlling-the-rasterize-width-for-notebook-related-expression – Szabolcs

+0

What evaluará primero, * DynamicExpression o dynamic visible? ¿O es una carrera de ratas? – Kuba

4

A DynamicBox con Initialization es capaz de la función básica. Puede ajustar el tamaño de la paleta para que el objeto no sea visible y seguirá funcionando.

Aquí hay un código para una pequeña paleta de muestra. Establece un valor para var. El código activo se compensa con espacios en blanco.

(* 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 *) 
+0

Oye, ¿qué paleta es esa? : D Mi pregunta es: ¿está seguro de que el código de inicialización se ejecutará * incluso si 'DynamicBox' no está visible *?Este no parece ser el caso aquí. (Pero eso no es un gran problema, creo que todavía puedo usar este enfoque.) – Szabolcs

+0

Hice un portátil con un DynamicBox al final (no visible al abrir el portátil). Después de reiniciar Mathematica y volver a abrir el notebook, la inicialización no se ejecutó. (* Fue * ejecutado más tarde después de que me desplacé hasta el final.) Simplemente señalando esto. De lo contrario, puedo usar el enfoque, y este no es un problema para mí en la práctica. – Szabolcs

+0

@Szabolcs (# 1) Soy muy aficionado a esa paleta. :-) (# 2) Extraño, lo comprobé específicamente, sabiendo que los objetos dinámicos están inactivos cuando están ocultos, y encontré que funcionó. ¿Quizás porque en mi sistema, con el cuaderno de muestras, solo * está * fuera de marco? –

Cuestiones relacionadas