Настройте размер кнопки TogglerBar в Mathematica - PullRequest
5 голосов
/ 10 июня 2011

Можно ли настроить размер / шрифт TogglerBar, чтобы они все были одинаково большими в случае разного размера имени.

Пример, приведенный ниже, представляет собой решение, предложенное Велизарием для: «Можно ли использовать TogglerBar как несколько CheckBox в Mathematica?»

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

Manipulate[Graphics[
{
{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*)
If[MemberQ[whatToDisplay, "I am a Circle"],
{Red, Circle[{5, 5}, r]}],
If[MemberQ[whatToDisplay, "and I am a very nice Square"], {Blue,
Rectangle[{5, 5}, {r, r}]}],
If[MemberQ[whatToDisplay, "Other"], {Black,
 Line[Tuples[{3, 4}, 2]]}]
},
PlotRange -> {{0, 20}, {0, 10}}
],
{{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1,
ControlType -> Slider,
ControlPlacement -> Top},  
Control@{{whatToDisplay, True,
Style["What", Black, Bold, 12]}, {"I am a Circle",
"and I am a very nice Square", "Other"},
ControlType -> TogglerBar,
Appearance -> "Horizontal",
ControlPlacement -> Top}]

enter image description here

РЕДАКТИРОВАТЬ : Это ужасно некрасиво в коде (если мы все еще можем назвать его кодом), но хорошо выглядит на дисплее.

enter image description here

enter image description here

Ответы [ 3 ]

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

В Mathematica 8 введено Overlay, что позволяет легко накладывать друг на друга несколько выражений. В сочетании с Invisible (начиная с версии 6) у нас есть все необходимые ингредиенты, чтобы легко синхронизировать все размеры кнопок, не прибегая к подсчету пробелов или пикселей. Следующий код иллюстрирует их использование с выделением соответствующих частей: DynamicModule[{options, allLabels, size, pad} , options = { "I am a Circle" -> {Red, Circle[{5, 5}, size]} , "and I am a very nice Square" -> {Blue, Rectangle[{5, 5}, {size, size}]} , "Other" -> {Black, Line[Tuples[{3, 4}, 2]]} } ; allLabels = options[[All, 1]] ; <strong><em>pad[label_] := Overlay[Append[Invisible /@ allLabels, label], Alignment -> Center]</em></strong> ; Manipulate[ Graphics[what /. options /. size -> r, PlotRange -> {{0, 20}, {0, 10}}] , {{r, 1, "Radius"}, 1, 5, 1} , {{what, {}, "What"}, <strong><em># -> pad[#] & /@</strong></em> allLabels, TogglerBar} ] ]

Manipulate result

Определение:

pad[label_] :=
  Overlay[Append[Invisible /@ allLabels, label], Alignment -> Center]

определяет функцию, которая накладывает все метки невидимо друг на друга, а затем визуально помещает желаемую метку поверх этого. В результате получается желаемая метка с достаточным количеством пробелов с обеих сторон для размещения любых других меток.

Оператор Manipulate использует pad для создания меток для TogglerBar: {{what, {}, "What"}, <strong><em># -> pad[#]</em></strong> & /@ allLabels, TogglerBar}

Обратите внимание, что метки указываются в форме <em>value</em> -> <em>label</em>, чтобы значения могли сохранять свою первоначальную форму без спецификаторов Overlay и Invisible, добавленных pad.

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

Это способ, хотя и не вполне удовлетворительный, поскольку длина панели не рассчитывается автоматически. Давайте назовем это первым подходом ...

Manipulate[
 Graphics[{{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*)
   If[MemberQ[whatToDisplay, "I am a Circle"], {Red, Circle[{5, 5}, r]}], 
   If[MemberQ[whatToDisplay, "and I am a very nice Square"],
                                               {Blue, Rectangle[{5, 5}, {r, r}]}], 
   If[MemberQ[whatToDisplay, "Other"], {Black, Line[Tuples[{3, 4}, 2]]}]}, 
  PlotRange -> {{0, 20}, {0, 10}}],
  {{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1, ControlType -> Slider, 
                                                 ControlPlacement -> Top}, 


 Control@{{whatToDisplay, True, Style["What", Black, Bold, 12]}, 
           (# ->  Panel[#, ImageSize -> 150, FrameMargins -> 0, 
                           Background -> White, 
                           Alignment -> Center]) & /@ 
           {"I am a Circle",  "and I am a very nice Square", "Other"}, 
           ControlType -> TogglerBar,
           Appearance -> "Horizontal", 
           ControlPlacement -> Top}]

enter image description here

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

здесь у вас есть лучший подход с автоматическим вычислением размера:

(* get the Image Size first*)
ley = {"I am a Circle", "and I am  Square", "Other"};
sZ = Max[Dimensions[ImageData[Rasterize[#][[1]]]][[2]] & /@ ley];

Manipulate[
 Graphics[
 {{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*)
   If[MemberQ[whatToDisplay, "I am a Circle"], 
                                     {Red, Circle[{5, 5}, r]}], 
   If[MemberQ[whatToDisplay, "and I am a very nice Square"],
                                     {Blue, Rectangle[{5, 5}, {r, r}]}], 
   If[MemberQ[whatToDisplay, "Other"], 
                                     {Black, Line[Tuples[{3, 4}, 2]]}]}, 
  PlotRange -> {{0, 20}, {0, 10}}],

 (*Controls Follow *)

 {{r, 1, Style["Radius", Black, Bold, 12]}, 1, 5, 1, 
    ControlType      -> Slider, 
    ControlPlacement -> Top }, 

  Control@{{whatToDisplay, True, Style["What", Black, Bold, 12]},
    (# -> Panel[#, ImageSize    -> sZ, 
                   FrameMargins -> 0, 
                   Background   -> White, 
                   Alignment    -> Center]) & /@ ley,
     ControlType      -> TogglerBar, 
     Appearance       -> "Horizontal", 
     ControlPlacement -> Top}]
3 голосов
/ 10 июня 2011

Mathematica может где-нибудь сделать это, но я этого не знаю. Итак, вот предлагаемое решение: Сначала это дополняет строку влево и вправо так, чтобы она имела длину n:

  Clear[strpad];
strpad[str_String, n_] := Module[
{strlength, exc, excr},
    strlength = StringLength@str;
    exc = Floor[(n - strlength)/2];
    excr = n - strlength - exc;
    StringJoin[
        Table[" ", {i, exc}],
        str,
        StringJoin[Table[" ", {i, excr}]]]]

Затем измените вашу программу так, чтобы вы либо использовали эти дополненные строки, либо добавили Rule[#, strpad[#, 30]] & /@ непосредственно перед {"I am a Circle", "and I am a very nice Square", "Other"}, чтобы ваш код стал

 Manipulate[
   Graphics[{{White, Circle[{5, 5}, r]},(*For Mma 7 compatibility*)
 If[MemberQ[whatToDisplay, "I am a Circle"], {Red, 
 Circle[{5, 5}, r]}], 
  If[MemberQ[whatToDisplay, "and I am a very nice Square"], {Blue, 
 Rectangle[{5, 5}, {r, r}]}], 
  If[MemberQ[whatToDisplay, "Other"], {Black, 
 Line[Tuples[{3, 4}, 2]]}]}, 
 PlotRange -> {{0, 20}, {0, 10}}], {{r, 1, 
  Style["Radius", Black, Bold, 12]}, 1, 5, 1, ControlType -> Slider, 
 ControlPlacement -> Top}, 
Control@{{whatToDisplay, True, Style["What", Black, Bold, 12]}, 
  Rule[#, strpad[#, 30]] & /@ {"I am a Circle", "and I am a very nice Square", "Other"},ControlType -> TogglerBar, Appearance -> "Horizontal", 
 ControlPlacement -> Top}]
...