8

Occasionalmente sarebbe preferibile avere un codice di inizializzazione per le tavolozze (dei pulsanti). Ad esempio, potrebbe definire alcune funzioni utilizzate dai pulsanti della tavolozza.Come eseguire il codice di inizializzazione per una tavolozza?

Qual è il modo più semplice e preferibile per definire/eseguire il codice di inizializzazione per una tavolozza?

  • L'inizializzazione può essere eseguito sia quando la tavolozza viene caricato o quando si preme un tasto per la prima volta (possibile problema:? cosa succede se il kernel è stato riavviato dopo la tavolozza è stato caricato)
  • Il le definizioni dovrebbero essere in qualche modo localizzate (ad esempio nel loro contesto personale: fare in modo che i contesti di quaderno siano di aiuto?)
  • Se possibile, preferirei una soluzione minima (ad esempio codice extra nel minor numero possibile di posizioni, file di palette autonomo con nessun file pacchetto aggiuntivo, creazione della tavolozza utilizzando gli strumenti di convenienza esistenti del menu delle tavolozze o CreatePalette, ecc.)
  • (Si può presumere che il codice di inizializzazione sia veloce, ad es. Si compone di definizioni soltanto)
+1

+1 bella domanda –

+0

@ Mr.Wizard Nonostante alcuni problemi che potrebbe avere (ad esempio l'inizializzazione doppia o ritardata), sembra aver funzionato per il caso d'uso un po 'limitato che ho. – Szabolcs

+0

@ Mr.Wizard Vedi qui per un possibile problema: https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/n-lh8sc83Qs/discussion – Szabolcs

risposta

10

Hai ragione di essere preoccupato per la visibilità del Dynamic essere un problema. Il modo per garantire assolutamente un'espressione Dynamic da valutare indipendentemente dalla visibilità di una qualsiasi delle singole celle è utilizzare NotebookDynamicExpression. Ecco un esempio che illustra NotebookDynamicExpression di lavoro mentre un Dynamic fallisce perché è nascosto all'interno di un gruppo a celle chiuse:

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

Quando si valuta questo, si noti che il Dynamic in NotebookDynamicExpression viene valutata immediatamente. DynamicWrapper non viene mai valutato finché non si apre il gruppo di celle, che è possibile fare facendo clic sul testo "Fare clic per aprire".

In questo esempio, incidentalmente, si noti che ho avvolto lo NotebookDynamicExpression con Refresh. La funzione Refresh[#, None]& si assicurerà che il codice venga valutato solo una volta, quando il notebook viene aperto per la prima volta. In caso contrario, il codice obbedirebbe alle proprietà standard di Dynamic e valuterà ogniqualvolta una qualsiasi delle dipendenze cambierà.

NotebookDynamicExpression è in circolazione dalla v6, ma è stato documentato solo nella v8. Inoltre sono documentati i relativi cugini, CellDynamicExpression e FrontEndDynamicExpression.

+1

Benvenuto (indietro) su StackOverflow, e grazie per l'asnwer! E 'bello finalmente vederti qui. Se hai tempo, forse puoi anche dare un'occhiata a questa domanda relativa alla front-end: http://stackoverflow.com/questions/8353838/controlling-the-rasterize-width-for-notebook-related-expression – Szabolcs

+0

Cosa valuterà prima, * DynamicExpression o dinamica visibile? O è una corsa al successo? – Kuba

4

Un DynamicBox con Initialization è capace della funzione di base. È possibile ridimensionare la tavolozza in modo tale che l'oggetto non sia visibile e continuerà a funzionare.

Questo è il codice per una piccola tavolozza campione. Imposta un valore per var. Il codice attivo è sfalsato con spazi bianchi.

(* 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

Ehi, che tavolozza è? : D La mia domanda è: sei sicuro che il codice di inizializzazione verrà eseguito * anche se il 'DynamicBox' non è visibile *?Questo non sembra essere il caso qui. (Ma non è un grosso problema, penso di poter ancora utilizzare questo approccio.) – Szabolcs

+0

Alla fine ho creato un blocco note con un DynamicBox (non visibile all'apertura del notebook). Dopo aver riavviato Mathematica e riaperto il notebook, l'inizializzazione non è stata eseguita. (È * stato * eseguito più tardi dopo che ho fatto scorrere fino alla fine.) Indicando questo. Altrimenti posso usare l'approccio, e questo non è un problema per me nella pratica. – Szabolcs

+0

@Szabolcs (# 1) Sono molto affezionato a questa tavolozza. :-) (# 2) Strano, l'ho verificato specificatamente, sapendo che gli oggetti dinamici sono inattivi quando nascosti, e ho scoperto che ha funzionato. Forse perché sul mio sistema, con il notebook di esempio, è solo * appena * fuori dal frame? –

Problemi correlati