8

कभी-कभी पैलेट (बटनों) के लिए कुछ प्रारंभिक कोड होना बेहतर होगा। उदाहरण के लिए, यह पैलेट बटन द्वारा उपयोग किए जाने वाले कुछ फ़ंक्शंस को परिभाषित कर सकता है।पैलेट के लिए प्रारंभिक कोड कैसे चलाएं?

पैलेट के लिए प्रारंभिक कोड को परिभाषित/चलाने का सबसे आसान और बेहतर तरीका क्या है?

  • प्रारंभ चला सकते हैं या तो जब पैलेट भरी हुई है या किसी बटन पहली बार के लिए दबाया जाता है जब (संभव मुद्दा: क्या हुआ अगर गिरी पुन: प्रारंभ होने के बाद पैलेट लोड किया गया था)
  • परिभाषाओं को किसी भी तरह स्थानीयकृत किया जाना चाहिए (यानी अपने स्वयं के संदर्भ में - अद्वितीय नोटबुक संदर्भ यहां मदद करते हैं?)
  • यदि संभव हो, तो मैं न्यूनतम प्रयास समाधान (यानी कम से कम संभव स्थानों पर अतिरिक्त कोड, स्वयं निहित पैलेट फ़ाइल के साथ अतिरिक्त कोड पसंद करूंगा) पैलेट मेनू याके मौजूदा सुविधा उपकरण का उपयोग करके कोई अतिरिक्त पैकेज फ़ाइलें, पैलेट निर्माण नहीं, आदि)
  • (आप मान सकते हैं कि प्रारंभिक कोड तेजी से चलता है, उदा। इसमें केवल परिभाषाएं शामिल हैं)
+1

+1 अच्छा प्रश्न –

+0

@ श्री विज़ार्ड कुछ मुद्दों के बावजूद (उदाहरण के लिए डबल या देरी शुरूआत) हो सकता है, ऐसा लगता है कि मेरे पास कुछ प्रतिबंधित उपयोग मामले के लिए काम किया है। – Szabolcs

+0

@ श्री विज़ार्ड संभावित समस्या के लिए यहां देखें: https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/n-lh8sc83Qs/discussion – Szabolcs

उत्तर

10

आप सही हैं एक मुद्दा जा रहा है 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]]]] 

जब आप इस का मूल्यांकन, ध्यान दें कि NotebookDynamicExpression में Dynamic तुरंत मूल्यांकन करता है। DynamicWrapper तब तक मूल्यांकन नहीं करता जब तक कि आप सेल समूह खोलें, जिसे आप "खोलने के लिए क्लिक करें" टेक्स्ट पर क्लिक करके कर सकते हैं।

इस उदाहरण में, आकस्मिक रूप से, ध्यान दें कि मैंने को Refresh के साथ लपेट लिया है। फ़ंक्शन Refresh[#, None]& यह सुनिश्चित करेगा कि कोड केवल एक बार मूल्यांकन करेगा - जब नोटबुक पहली बार खोला जाता है। अन्यथा, कोड Dynamic के मानक गुणों का पालन करेगा और किसी भी निर्भरता में परिवर्तन होने पर मूल्यांकन करेगा।

NotebookDynamicExpression v6 के आसपास रहा है, लेकिन केवल v8 में दस्तावेज किया गया था। इसके संबंधित चचेरे भाई भी हैं, CellDynamicExpression और FrontEndDynamicExpression

+1

स्टैक ओवरव्लो में आपका स्वागत है (पीछे), और एस्वर के लिए धन्यवाद! अंत में आपको यहां देखना अच्छा होता है। यदि आपके पास समय है, तो शायद आप इस फ्रंट-एंड-संबंधित प्रश्न पर भी नज़र डालें: http://stackoverflow.com/questions/8353838/controlling-the-rasterize-width-for-notebook-related-expression – Szabolcs

+0

क्या पहले मूल्यांकन करेंगे, * गतिशील एक्सप्रेशन या दृश्यमान गतिशील? या यह एक चूहा दौड़ है? – Kuba

4

DynamicBoxInitialization के साथ मूल कार्य करने में सक्षम है। आप पैलेट को आकार दे सकते हैं जैसे ऑब्जेक्ट दिखाई नहीं दे रहा है, और यह अभी भी काम करेगा।

यहां एक छोटे नमूना पैलेट के लिए कोड है। यह 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 *) 
+0

अरे, वह पैलेट क्या है? : डी मेरा सवाल है: क्या आप सुनिश्चित हैं कि प्रारंभिक कोड निष्पादित किया जाएगा * भले ही 'डायनामिकबॉक्स' दिखाई नहीं दे रहा है *?यह यहां मामला प्रतीत नहीं होता है। (लेकिन यह एक बड़ा मुद्दा नहीं है, मुझे लगता है कि मैं अभी भी इस दृष्टिकोण का उपयोग कर सकता हूं।) – Szabolcs

+0

मैंने अंत में एक डायनामिकबॉक्स के साथ एक नोटबुक बनाया (नोटबुक खोलते समय दृश्यमान नहीं)। गणित को पुनरारंभ करने और नोटबुक को फिर से खोलने के बाद, प्रारंभिकरण निष्पादित नहीं किया गया था। (इसे * अंत में स्क्रॉल करने के बाद बाद में निष्पादित किया गया था।) बस इसे इंगित करें। अन्यथा मैं दृष्टिकोण का उपयोग कर सकता हूं, और यह मेरे लिए अभ्यास में कोई मुद्दा नहीं है। – Szabolcs

+0

@Szabolcs (# 1) मैं उस पैलेट का बहुत शौकिया हूं। :-) (# 2) अजीब, मैंने विशेष रूप से जांच की, यह जानकर कि छुपे हुए गतिशील वस्तुएं निष्क्रिय होती हैं, और मैंने पाया कि यह काम करता है। शायद क्योंकि मेरे सिस्टम पर, नमूना नोटबुक के साथ, यह केवल फ्रेम से बाहर * बस * है? –