Как сделать выборочное раскрывающееся меню в Mathematica?

Мне не хватает места в интерфейсе Manipulate. Итак, я хочу посмотреть, смогу ли я перегрузить PopupMenu, чтобы служить более чем одной цели.

Вот проблема:

У меня есть PopupMenu, где я использую, чтобы выбрать из него запись. Но в зависимости от другого выбора, который я сделаю где-то еще, некоторые из этих пунктов меню больше не будет иметь смысла выбирать.

Мне было интересно, могу ли я сделать некоторые записи в PopupMenu «выбираемыми» на основе настройки Dynamic? (может быть отключен или выделен серым цветом, или, что было бы лучше, иметь весь список динамически, т.е.все всплывающее меню должно быть динамическим, поэтому я могу выбирать разные меню в зависимости от значения другой динамики. Но я не думаю, что это возможно)

В настоящее время ВСЕ всплывающее меню может быть включено или отключено в зависимости от динамической настройки. Но я хочу сделать это на начальном уровне внутри Popupmenu.

Вот пример для иллюстрации:

Manipulate[selection,
 Grid[{
   {"x", SetterBar[Dynamic[x], {1, 2}]},
   {"selection", PopupMenu[Dynamic[selection],
     {
      "NONE", "SOR", "SSOR"
      }, Enabled -> Dynamic[x == 1]], SpanFromLeft
    }
   }]
 ]

enter image description here

В приведенном выше примере, когда X = 1, доступно все меню.

Но то, что я хочу, если X = 1, - это иметь возможность выбирать только «НЕТ» (или в списке просто отображается «НЕТ»), а когда X = 2, то иметь возможность выбирать только «SOR». и «SSOR» (или в списке просто показаны эти 2 варианта).

т.е. система не позволит выбрать «SOR», если x = 2. Попытка выбрать его не вызовет никаких изменений, и в меню останется прежняя настройка и не изменится.

Опять же, я знаю, что могу разбить вещи на 2 popuMenus и управлять каждым из них на основе настройки X, как показано ниже, но у меня нет места для добавления дополнительных меню:

Manipulate[If[x == 1, selectionA, selectionB],
 Grid[{
   {"x", SetterBar[Dynamic[x], {1, 2}]},
   {"selection", PopupMenu[Dynamic[selectionA],
     {
      "NONE"
      }, Enabled -> Dynamic[x == 1]], SpanFromLeft
    },
   {"selection", PopupMenu[Dynamic[selectionB],
     {
      "SOR", "SSOR"
      }, Enabled -> Dynamic[x == 2]], SpanFromLeft
    }
   }]
 ]

enter image description here

Мой вопрос: есть ли способ сделать это в Mathematica? Я использую 8.04.

Лучшим решением было бы иметь список элементов для самого меню с помощью Dynamic (или все меню было динамическим), поэтому я могу указать ему использовать listA, когда X = 1, или использовать listB, когда X = 2, и т. Д. Но я не знаю, как это сделать, и не знаю, возможно ли это вообще.

пс. Это моя текущая попытка решения

Manipulate[selection,

 Grid[{
   {"x", SetterBar[Dynamic[x], {1, 2}]},
   {"selection", PopupMenu[Dynamic[selection],
     {
      Dynamic[If[x == 1, listA, listB]]
      }
     ]
    }
   }
  ],
 Initialization :>
  (
   listA = {"A", "B"};
   listB = {"C", "D"};
   )
 ]

, но оно пока работает не очень хорошо. Я буду продолжать ....

спасибо

Обновление:

Взгляд на решение Саймона ниже вдохновил меня немного больше, так что это то, что у меня есть на данный момент:

Manipulate[selection,

 Grid[{
   {"x", SetterBar[Dynamic[x], {1, 2}]},
   {"selection",

    Dynamic[If[x == 1,
      (
       selection = "A";
       PopupMenu[Dynamic[selection], {"A", "B"}]
       ),
      (
       selection = "C";
       PopupMenu[Dynamic[selection], {"C", "D"}]
       )
      ]
     ]
    }
   }
  ]
 ]

enter image description here

5
задан Nasser 7 December 2011 в 13:25
поделиться