Саморазрушительная кнопка внутри колонны - PullRequest
3 голосов
/ 17 июня 2011

Как создать 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 @@ {}]]}]

Но с этим кодом Button не исчезает после его нажатия.Можно ли сделать его саморазрушительным?


Окончательное решение, основанное на идеях belisarius и mikuszefski :

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

Ключевыми моментами являются:

  • введение дополнительной Dynamic переменной b и связывание ее со значением Options[$FrontEnd, "VersionedPreferences"],
  • , оборачивая всю Column конструкцию Dynamic вместо использования Dynamic внутри Column.

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Возможно

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

Редактировать

Отвечая на ваш комментарий. Пожалуйста, попробуйте следующее. Включение Column[ ] с 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 @@ {}]}]]
4 голосов
/ 17 июня 2011

Хм, не знаю, если я правильно понял, но, может быть, это:

x = True;

Динамический [Столбец [{Кнопка [«Сброс», x = Истина], Если [x, Button ["Нажмите меня", x = False]]}] ]

...