柱内的自毁按钮

Ale*_*kov 3 wolfram-mathematica mathematica-frontend

如何创建一个Button只有当某个全局FrontEnd设置的值是,False并且Column在按下它后将整个行自我毁坏并将其设置为True

我需要这样的东西:

Column[{"Item 1", "Item 2", 
  Dynamic[If[
    Last@Last@Options[$FrontEnd, "VersionedPreferences"] === False, 
    Button["Press me!", 
     SetOptions[$FrontEnd, "VersionedPreferences" -> True]], 
    Sequence @@ {}]]}]
Run Code Online (Sandbox Code Playgroud)

但是使用此代码Button后,按下它后不会消失.是否有可能使其具有自我毁灭性?


基于belisariusmikuszefski的想法的最终解决方案:

PreemptProtect[SetOptions[$FrontEnd, "VersionedPreferences" -> False];
   b = True];

Dynamic[Column[
  Join[{"Item 1", "Item 2"}, 
   If[Last@Last@Options[$FrontEnd, "VersionedPreferences"] === False &&
      b == True, {Button[
      Pane[Style[
        "This FrontEnd uses shared preferences file. Press this \
button to set FrontEnd to use versioned preferences file (all the \
FrontEnd settings will be reset to defaults).", Red], 300], 
      AbortProtect[
       SetOptions[$FrontEnd, "VersionedPreferences" -> True]; 
       b = False]]}, {}]], Alignment -> Center], 
 Initialization :> 
  If[! Last@Last@Options[$FrontEnd, "VersionedPreferences"], b = True,
    b = False]]
Run Code Online (Sandbox Code Playgroud)

关键点是:

  • 引入附加Dynamic变量b并将其与值绑定Options[$FrontEnd, "VersionedPreferences"],
  • 用整个Column构造包裹Dynamic而不是在Dynamic里面使用 Column.

Dr.*_*ius 6

也许

PreemptProtect[SetOptions[$FrontEnd, "VersionedPreferences" -> False]; b = True]; 

Column[{"Item 1", "Item 2", Dynamic[
   If[Last@Last@Options[$FrontEnd, "VersionedPreferences"]===False && b == True, 
    Button["Here!", SetOptions[$FrontEnd, "VersionedPreferences"->True];b=False], 
   "Done"]]}]
Run Code Online (Sandbox Code Playgroud)

编辑

回答你的评论.请尝试以下方法.包含Column[ ]with Dynamic[ ]允许调整大小:

PreemptProtect[SetOptions[$FrontEnd, "VersionedPreferences" -> False]; b = True]; 
Dynamic[
  Column[{
   "Item 1", 
   "Item 2",
   If[Last@Last@Options[$FrontEnd, "VersionedPreferences"] === False && b == True, 
    Button["Press me!", SetOptions[$FrontEnd, "VersionedPreferences" -> True]; b=False], 
    Sequence @@ {}]}]]
Run Code Online (Sandbox Code Playgroud)