Wie führe ich Initialisierungscode für eine Palette?

8

Gelegentlich wäre es vorzuziehen, einen Initialisierungscode für Paletten (von Schaltflächen) zu haben. Zum Beispiel könnte es einige Funktionen definieren, die von Palettenknöpfen verwendet werden.

Was ist der einfachste und vorzuziehende Weg, um Initialisierungscode für eine Palette zu definieren / auszuführen?

  • Die Initialisierung kann entweder beim Laden der Palette oder beim ersten Drücken einer Schaltfläche ausgeführt werden ( mögliches Problem: Was, wenn der Kernel nach dem Laden der Palette neu gestartet wird?)
  • Die Definitionen sollten irgendwie lokalisiert sein (d. h. in ihrem eigenen Kontext - helfen hier einzigartige Notizbuchkontexte?)
  • Wenn möglich, würde ich eine Lösung mit minimalem Aufwand bevorzugen (zB extra Code an den wenigsten möglichen Stellen, selbstständige Palettendatei ohne zusätzliche Paketdateien, Palettenerstellung mit den vorhandenen Komfortwerkzeugen des Palettenmenüs oder CreatePalette , etc .)
  • (Sie können davon ausgehen, dass der Initialisierungscode schnell ausgeführt wird, z. B. besteht er nur aus Definitionen)
Szabolcs 28.10.2011, 10:11
quelle

2 Antworten

10

Sie haben recht, wenn Sie sich Sorgen machen, dass die Dynamic ein Problem darstellt. Der Weg, um sicherzustellen, dass ein Dynamic -Ausdruck unabhängig von der Sichtbarkeit einer der einzelnen Zellen ausgewertet wird, ist die Verwendung von NotebookDynamicExpression . Hier ist ein Beispiel, das NotebookDynamicExpression funktioniert zeigt, während ein Dynamic fehlschlägt, weil es in einer geschlossenen Zellengruppe versteckt ist:

%Vor%

Beachten Sie bei der Auswertung, dass Dynamic in NotebookDynamicExpression sofort ausgewertet wird. Das DynamicWrapper wird niemals ausgewertet, bis Sie die Zellengruppe öffnen, was Sie tun können, indem Sie auf den "Click to open" -Text klicken.

In diesem Beispiel merkt man übrigens, dass ich das NotebookDynamicExpression mit Refresh eingepackt habe. Die Funktion Refresh[#, None]& stellt sicher, dass der Code nur einmal ausgewertet wird - wenn das Notebook zum ersten Mal geöffnet wird. Andernfalls würde der Code den Standardeigenschaften von Dynamic entsprechen und immer dann ausgewertet, wenn sich eine der Abhängigkeiten ändert.

NotebookDynamicExpression gibt es seit v6, wurde aber nur in v8 dokumentiert. Ebenfalls dokumentiert sind die verwandten Cousins, CellDynamicExpression und FrontEndDynamicExpression .

    
John Fultz 02.12.2011, 08:34
quelle
4

A DynamicBox mit Initialization kann die Grundfunktion erfüllen. Sie können die Palette so skalieren, dass das Objekt nicht sichtbar ist und weiterhin funktioniert.

Hier ist Code für eine kleine Beispielpalette. Es legt einen Wert für var fest. Der aktive Code wird mit Leerzeichen versetzt.

%Vor%     
Mr.Wizard 28.10.2011 10:38
quelle