Кнопка «Предыдущая-Следующая» вместо Slider в Mathematica - PullRequest
3 голосов
/ 12 июня 2011

Можно ли использовать несколько кнопок «Предыдущий-Следующий» вместо ползунка, как в примере ниже, когда контролируемое значение является дискретным?

Я нашел Манипулятор довольно уродливым и хотел бы, чтобы некоторые из них были сеттерского типа, если это возможно.

Manipulate[
           Graphics[
                    {
                     Rectangle[{1, 1}, {3, 3}],
                      Circle[{where, 2}, 1]
                    }, 
                     PlotRange -> {{0, 11}, {0, 3}}, ImageSize -> {300, 60}
                    ],
           {where, 1, 10, 1, Slider}
          ]

enter image description here

Ответы [ 3 ]

5 голосов
/ 12 июня 2011

Вы можете создавать свои собственные элементы управления, используя Button, например:

Manipulate[
 Graphics[
  {Rectangle[{1, 1}, {3, 3}],
   Circle[{where, 2}, 1]},
  PlotRange -> {{0, 11}, {0, 3}},
  ImageSize -> {300, 60}
  ],
 {{where, 1, ""}, 
  Button["Prev", where = Max[1, where - 1], Appearance -> "Palette", 
    ImageSize -> {50, Automatic}] &},
 {{where, 1, ""}, 
  Button["Next", where = Min[10, where + 1], Appearance -> "Palette",
    ImageSize -> {50, Automatic}] &},
 ControlPlacement -> Left]

enter image description here

4 голосов
/ 12 июня 2011

Насколько я знаю, если для Manipulate не указан элемент управления, Mathematica будет решать, какой элемент управления использовать, основываясь на заданных значениях. Обычно это элемент управления «Манипулятор», который отличается от элемента управления «Ползунок» (в вашем примере) тем, что элемент управления можно расширить для использования шагов вперед / назад, воспроизведения и т. Д. Этого может быть достаточно:

Manipulate[
 Graphics[{Rectangle[{1, 1}, {3, 3}], Circle[{where, 2}, 1]}, 
  PlotRange -> {{0, 11}, {0, 3}}, ImageSize -> {300, 60}], {where, 1, 
  10, 1, Manipulator, Appearance -> "Open", 
  AppearanceElements -> {"StepLeftButton", "StepRightButton"}}]

Довольно недавний вопрос здесь, посвященный SO, касался того, как показать эти дискретные кнопки для манипулятора с самого начала с помощью опции: Appearance-> Open Как показать элемент управления анимацией по умолчанию .

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

AppearanceElements -> {"StepLeftButton", "StepRightButton"}

, который я добавил к примеру кода выше.

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

Manipulate[
 Graphics[{Rectangle[{1, 1}, {3, 3}], Circle[{where, 2}, 1]}, 
  PlotRange -> {{0, 11}, {0, 3}}, ImageSize -> {300, 60}], {where, 1, 
  10, 1, ControlType -> Trigger, 
  AppearanceElements -> {"StepLeftButton", "StepRightButton"}}]

enter image description here

3 голосов
/ 13 июня 2011

Как показал Йода, Button может использоваться для Следующая и Предыдущая кнопки в Manipulate. Кнопки такого типа часто используются для прохождения ограниченного круга объектов. В начале и конце этого диапазона кнопки «Назад» и «Далее» должны быть отключены соответственно. Чтобы заставить это работать, можно использовать свойство кнопки Enabled, и, поскольку его действие зависит от интерактивно изменяющегося значения, требуется Dynamic. В следующем примере с игрушкой показано, как это работает.

Пример кода:

votePictures[picturesInput_] :=
 DynamicModule[{pictures = picturesInput, status, i},
  status = Table["Not Voted", {Length[pictures]}];
  i = 1;
  Panel[
   Row[
    {
     Dynamic[Show[pictures[[i]], ImageSize -> 256]], Spacer[72 0.7],
     Column[
       {
        Row[{Style["Status  ", FontFamily -> "Arial-Bold"], 
          SetterBar[
           Dynamic[status[[i]]], {"No response", "Ugly", "Nice"}]}
        ], , ,
        Row[{
           Button["Previous", i -= 1, Enabled -> (i > 1)], 
           Button["Next", i += 1, Enabled -> (i < Length[pictures])]}
        ] // Dynamic,
        Row[
            {
             Style["Picture   ", FontFamily -> "Arial-Bold"], 
             Slider[Dynamic[i], {1, Length[pictures], 1},Appearance -> "Labeled"]
            }
        ], , ,
        Button["Save results", (*Export code here *)]
        }
       ] // Framed
     }
    ], ImageSize -> 750
   ]
  ]

pictures = ExampleData[#] & /@ ExampleData["TestImage"]

votePictures[pictures]

enter image description here

...