2011-06-17 2 views
3

Comment créer un Button qui sera affiché que lorsque la valeur de certains paramètre global FrontEnd est False et se autodétruira avec toute la ligne de la Column après l'avoir enfoncé la définition de cette valeur à True?autodestructeur Bouton intérieur Colonne

je besoin de quelque chose comme ceci:

Column[{"Item 1", "Item 2", 
    Dynamic[If[ 
    [email protected]@Options[$FrontEnd, "VersionedPreferences"] === False, 
    Button["Press me!", 
    SetOptions[$FrontEnd, "VersionedPreferences" -> True]], 
    Sequence @@ {}]]}] 

Mais avec ce code, la Button ne disparaît pas après avoir appuyé sur elle. Est-il possible de le rendre autodestructeur?


La solution finale basée sur des idées par belisarius et mikuszefski:

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

Dynamic[Column[ 
    Join[{"Item 1", "Item 2"}, 
    If[[email protected]@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[! [email protected]@Options[$FrontEnd, "VersionedPreferences"], b = True, 
    b = False]] 

Les points clés sont les suivants:

  • introduction supplémentaires Dynamic variables b et la liaison avec la valeur de Options[$FrontEnd, "VersionedPreferences"],
  • emballage entier Column construire avec Dynamic au lieu d'utiliser Dynamic à l'intérieur Column.

Répondre

6

Peut-être

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

Column[{"Item 1", "Item 2", Dynamic[ 
    If[[email protected]@Options[$FrontEnd, "VersionedPreferences"]===False && b == True, 
    Button["Here!", SetOptions[$FrontEnd, "VersionedPreferences"->True];b=False], 
    "Done"]]}] 

Modifier

Répondre à votre commentaire. S'il vous plaît essayez ce qui suit. Englobant le Column[ ] avec Dynamic[ ] permet le redimensionner:

PreemptProtect[SetOptions[$FrontEnd, "VersionedPreferences" -> False]; b = True]; 
Dynamic[ 
    Column[{ 
    "Item 1", 
    "Item 2", 
    If[[email protected]@Options[$FrontEnd, "VersionedPreferences"] === False && b == True, 
    Button["Press me!", SetOptions[$FrontEnd, "VersionedPreferences" -> True]; b=False], 
    Sequence @@ {}]}]] 
+0

Je souhaite détruire complètement la ligne entière de la colonne après avoir appuyé sur le bouton. –

+0

@Alexey Ohhh désolé, j'ai mal compris.Maintenant, je comprends le 'Sequence @@ {}' :) –

+0

@Alexey Voir Modifier, s'il vous plaît –

4

Hmm, je sais pas si je bien, mais peut-être ceci:

x = True;

dynamique [colonne [{Bouton [ "reset", x = True], Si [x, Bouton [ "me presse", x = False]]}] ]

+0

Avec ce code, le bouton disparaît, mais un espace blanc est laissé où elle se trouve. Je souhaite que la ligne correspondante de la 'Column' disparaisse complètement. –

+0

Il semble que votre version peut être améliorée simplement en ajoutant 'Sequence @@ {}' comme troisième argument de 'If'. –

+0

@Alexey try x = True; Dynamic [Si [x, Colonne [{Bouton ["réinitialiser", x = True], Bouton ["Appuyez sur moi", x = False]}], Colonne [{Button [" reset ", x = True]}]]] (bien sûr, vous avez deux versions du code qui diffèrent par l'existence ou non du second bouton, mais elles peuvent être construites à la volée) – acl