Как сделать выборочное выпадающее меню в Mathematica? - PullRequest
5 голосов
/ 07 декабря 2011

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

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

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

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

В настоящее время WHOLE PopupMenu может быть включено или отключено на основе динамической настройки.Но я хочу сделать это на начальном уровне внутри 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

Ответы [ 2 ]

6 голосов
/ 07 декабря 2011

Это то, что вы ищете?

Manipulate[
 Switch[x,
        1, If[selection =!= None, selection = None],
        2, If[selection === None, selection = "SOR"]];
 selection,
 {x, {1, 2}, ControlType -> SetterBar},
 {{selection, None}, Switch[x, 1, {None}, 2, {"SOR", "SSOR"}, _, {"huh"}], 
  ControlType -> PopupMenu}]

Обратите внимание на Switch в верхней части, которая контролирует значения по умолчанию для selection при изменении x.


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

После вашего запроса на локализацию логики меню для элемента управления Grid и кражи механизма Хайке по умолчанию, вот новая версия:

Manipulate[selection,
 Grid[With[{menu = {{None}, {"A", "B"}, {"emu", "num"}}},
   {{"Which menu?", SetterBar[Dynamic[x], Range[Length[menu]]]},
    {"Menu selection:", Dynamic[
      If[MemberQ[menu[[x]], selection], selection = menu[[x, 1]]];
      PopupMenu[Dynamic[selection], menu[[x]]]]}}]],
 {{selection, None}, None}, {{x, 1}, None}]

a boring screenshot

Обратите внимание, что список menu не нужно локализовать с помощью оператора With - его можно установить в другом месте кода.

5 голосов
/ 07 декабря 2011

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

choices = {{"a", "b", "c"}, {None}, {"e", "f"}};

Manipulate[
 If[Not[MemberQ[x, selection]], selection = x[[1]]];
 selection,
 {{x, choices[[1]]}, MapIndexed[# -> #2[[1]] &, choices], SetterBar}, 
 {selection, x, ControlType -> PopupMenu}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...