Bir palet için başlatma kodu nasıl çalıştırılır?

Bazen paletler için bazı butonların (butonların) bulunması tercih edilir. Örneğin, palet düğmeleri tarafından kullanılan bazı işlevleri tanımlayabilir.

Bir palet için başlatma kodunu tanımlamanın/çalıştırmanın en kolay ve tercih edilen yolu nedir?

  • Başlatma, palet yüklendiğinde veya herhangi bir düğmeye ilk kez basıldığında çalışabilir ( olası sorun: palet yüklendikten sonra çekirdek yeniden başlatılırsa ne olur?)
  • Tanımlar bir şekilde yerelleştirilmelidir (yani kendi bağlamında - benzersiz dizüstü bilgisayar bağlamları burada yardımcı olur mu?)
  • Mümkünse, en az çaba gerektiren bir çözüm (örneğin, mümkün olan en az sayıda yerde ekstra kod, fazladan paket dosya içermeyen kendi kendine yeten palet dosyası, palet menüsünün mevcut kullanım araçlarını kullanarak palet oluşturma veya CreatePalette <) tercih ederim./code>, vb.)
  • (başlatma kodunun hızlı çalıştığını varsayabilirsin, örneğin sadece tanımlardan oluşur)
8
@ Mr.Wizard Bazı sorunları (örneğin, çift veya gecikmeli başlatma) sahip olmasına rağmen, sahip olduğum sınırlı bir kullanım durumu için çalışmış gibi görünüyor.
katma yazar Szabolcs, kaynak
@ Mr.Wizard Olası bir sorun için buraya bakın: groups.google.com/d/topic/comp.soft-sys.math.mathematica/…
katma yazar Szabolcs, kaynak
+1 güzel soru
katma yazar Mr.Wizard, kaynak

2 cevap

Bir sorun olan Dinamik 'in görünürlüğü konusunda endişe duymaya hakkınız var. Her bir hücrenin görünürlüğüne bakılmaksızın değerlendirilecek bir Dynamic ifadesinin kesinlikle garanti edilme yolu NotebookDynamicExpression kullanmaktır. Aşağıda, kapalı bir hücre grubu içinde gizlendiği için Dinamik başarısız olduğunda NotebookDynamicExpression çalışmasını gösteren bir örnek verilmiştir:

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

Bunu değerlendirdiğinizde, NotebookDynamicExpression içindeki Dynamic öğesinin hemen değerlendirildiğini unutmayın. DynamicWrapper , "Açmak için tıklayın" metnini tıklatarak yapabileceğiniz hücre grubunu açana kadar asla değerlendirmez.

In this example, incidentally, notice that I wrapped the NotebookDynamicExpression with Refresh. The function Refresh[#, None]& will make sure that the code evaluates only once -- when the notebook is first opened. Otherwise, the code would obey the standard properties of Dynamic and evaluate whenever any of the dependencies change.

NotebookDynamicExpression has been around since v6, but was only documented in v8. Also documented are its related cousins, CellDynamicExpression and FrontEndDynamicExpression.

10
katma
StackOverflow'a hoş geldiniz (geri) ve asnwer için teşekkürler! Sonunda seni burada görmek güzel. Eğer zamanınız varsa, belki de bu konuyla ilgili soruya bir göz atabilirsiniz: stackoverflow.com/questions/8353838/…
katma yazar Szabolcs, kaynak
İlk olarak ne değerlendirecek, * DynamicExpression veya görünür dinamik? Yoksa bu bir fare yarışı mı?
katma yazar Kuba, kaynak

Initialization içeren bir DynamicBox , temel işlevlerden yararlanabilir. Paleti nesnenin görünmeyecek şekilde boyutlandırabilirsiniz ve hala çalışır.

İşte küçük bir örnek palet için kod. var için bir değer ayarlar. Aktif kod, boşluk ile dengelenmiştir.

(* 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 *)
4
katma
Hey, bu ne palet? : D Sorum şu: DynamicBox görünmüyor olsa bile başlatma kodunun çalıştırılacağından emin misiniz ? Bu durum burada görünmüyor. (Ama bu büyük bir sorun değil, bence bu yaklaşımı hala kullanabilirim.)
katma yazar Szabolcs, kaynak
Sonunda DynamicBox'la bir dizüstü bilgisayar yaptım (dizüstü bilgisayarı açarken görünmez). Mathematica'yı yeniden başlattıktan ve not defterini yeniden açtıktan sonra başlatma işlemi gerçekleştirilmedi. (Sonuna kadar ilerledikten sonra gerçekleştirildim.) Sadece bunu işaret ediyordum. Aksi halde yaklaşımı kullanabilirim ve bu benim için pratikte bir sorun değil.
katma yazar Szabolcs, kaynak
@Szabolcs (# 1) O paleti çok seviyorum. :-) (# 2) Garip, özellikle, dinamik nesnelerin gizlendiğinde etkisiz olduğunu bilerek kontrol ettim ve işe yaradığını buldum. Belki de sistemimde, örnek not defteri ile, sadece sadece çerçeve dışı mı?
katma yazar Mr.Wizard, kaynak