Мне не хватает места на интерфейсе 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
}
}]
]
В приведенном выше, когда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
}
}]
]
Мой вопрос: есть ли способ сделать вышеперечисленное в 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"}]
)
]
]
}
}
]
]