Как создать 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
.