Чтобы добавить разделитель между строками в сетке, я знаю, как это сделать, с помощью параметр Разделители
. Но это используется в конце, и тогда нужно знать номер строки, под которой должен находиться разделитель. Итак, для большой сетки я использую метод проб и ошибок, пока не найду правильный номер строки. Затем, когда я позже меняю сетку, мне придется снова провести пробу и ошибку, чтобы поставить разделитель в правильное место на случай, если он переместится после моих изменений.
В этом примере есть сетка с 3 строками, и я хочу добавить разделитель ниже, скажем, второй строки, чтобы я мог сделать это:
Grid[{
{1},
{2},
{3}
}, Frame -> True, Dividers -> {All, 3 -> True}]
Другой способ - поставить False
и True
, в правильном порядке, где мне нужен разделитель, например
Grid[{
{1},
{2},
{3}
}, Frame -> True, Dividers -> {All, {True, False, True, True}}]
Было бы неплохо, если бы я мог сделать что-то вроде этого (например, можно сделать для Manipulate) (конечно, это ниже здесь не работает)
Grid[{
{1},
{2},
Delimiter,
{3}
}, Frame -> True]
или
Grid[{
{1},
{Item[2,Dividers->True]},
{3}
}, Frame -> True]
или тому подобное.
Это упростит сопровождение кода.
Я смотрел на использование Item и тому подобное для этого, но не мог понять.
Кто-нибудь знает, как это сделать?
edit:
Кстати, этот трюк, если это возможно, применим не только к разделителям. Но было бы полезно иметь возможность делать многие другие параметры сетки, которые теперь выполняются на уровне сетки, а также на уровне элементов.Например, если я хочу добавить лишний пробел после некоторой строки, будет проще сказать это в том темпе, в котором я хотел, чтобы это было сделано. Кроме того, если бы я хотел изменить размер элемента, это было бы проще сделать на месте, то же самое для интервалов и т. Д. Чтобы при перемещении / копировании кода для всей строки или элемента он был самодостаточным и копировал его со всеми его варианты вместе.
Я думаю, что теперь для этого может потребоваться добавление новой опции в Mathematica Grid, чтобы она работала правильно и соответствовала общему дизайну сетки.
Это все до тех пор, пока для Mathematica не будет создан конструктор графического интерфейса.
Я обнаружил, что трачу более 60% своего времени, когда пишу демо, чтобы настроить графический интерфейс, чтобы он соответствовал и выглядел правильно. С помощью конструктора графического интерфейса я могу вместо этого потратить это время на работу над алгоритмом. Когда я использую Matlab GUIDE для создания графического интерфейса, на создание аналогичного графического интерфейса у меня уходит менее 5% времени.
Я бы хотел, чтобы WRI создал конструктор графического интерфейса для Mathematica, я думаю, что это будет убийственное приложение для Mathematica, если вы спросите меня. Но никто меня не спросил :)
edit (2)
прокомментируйте красивое решение Mr Wizard ниже.
В основном я хотел эту функцию для сеток, которые я использую для размещения элементов управления для Manipulate
. Вот простой пример:
Manipulate[x,
Grid[{
{Control[{{x, 0, "x"}, 0, 10, 1}]},
{Control[{{y, 0, "y"}, 0, 10, 1}]}
}, Frame -> None, Dividers -> {None, {False, True, False}}
]
]
(и мне нужно использовать Grid
для настройки элементов управления). Я не могу использовать здесь вызовы функций. Я не могу написать, используя решение Wizard, приведенное ниже, следующее:
Manipulate[x,
myGrid[{
{Control[{{x, 0, "x"}, 0, 10, 1}]},
spec["Divider"],
{Control[{{y, 0, "y"}, 0, 10, 1}]}
}, Frame -> None
],
Initialization :>
{
specfunc["Divider", lst_] := Dividers -> {None, # -> True & /@ lst};
myGrid[dat_, opts : OptionsPattern[]] :=
Module[{x = 1},
Grid[#, opts, Sequence @@ #2] & @@
Reap[If[MatchQ[#, _spec], Sow[x, #[[1]]]; ## &[], x++; #] & /@
dat, _, specfunc]
]
}
]
Это дает ошибку, поскольку Mathematica пытается сначала прочитать тело Manipulate, чтобы проанализировать его, ПЕРЕД чтением и обработкой раздела инициализации.
Но вне Manipulate это, конечно же, сработает:
myGrid[{
{Control[{{x, 0, "x"}, 0, 10, 1}]},
spec["Divider"],
{Control[{{y, 0, "y"}, 0, 10, 1}]}
}, Frame -> None
]
specfunc["Divider", lst_] := Dividers -> {None, # -> True & /@ lst};
myGrid[dat_, opts : OptionsPattern[]] :=
Module[{x = 1},
Grid[#, opts, Sequence @@ #2] & @@
Reap[If[MatchQ[#, _spec], Sow[x, #[[1]]]; ## &[], x++; #] & /@
dat, _, specfunc]
]
Мне нужно потратить больше времени на это, чтобы посмотреть, смогу ли я заставить его работать внутри Manipulate.
Кстати, заставить такие вещи работать внутри Manipulate действительно сложно. Единственный известный мне трюк - это использование макросов с шаблоном With [{}, .... Grid ....]
, который я узнал от Леонида.
Например, см. Этот мой вопрос
Как определить константы для использования с With [] в одном месте, а затем применить их позже?
edit (3) Возможно, я делаю что-то не так, но у меня возникают ошибки внутри Manipulate:
первый пример:
Manipulate[x,
Evaluate@grid[{
{Control[{{x, 0, "x"}, 0, 10, 1}]}
}
],
Initialization :>
{
grid[tab_, opts___] :=
Module[{divlocal, divglobal, div, pos},
divglobal = (Dividers /. opts) /. Dividers -> {False, False};
If[Depth[divglobal] == 1, divglobal = {divglobal, divglobal}];
If[Length[divglobal] == 1, AppendTo[divglobal, False]];
pos = Position[tab, Dividers -> _, 1];
divlocal =
MapIndexed[# - #2[[1]] + 1 -> Dividers /. tab[[#]] &,
Flatten[pos]];
divglobal[[2]] = {divglobal[[2]], divlocal};
Grid[Delete[tab, pos], Dividers -> divglobal, opts]];
}
]
выдает ошибку:
ReplaceAll::rmix: Elements of {False,{}} are a mixture of lists and nonlists. >>
то же самое, если я заменяю приведенное выше на
Evaluate@grid[{
Dividers -> {Thick, Blue},
{Control[{{x, 0, "x"}, 0, 10, 1}]}
}
],
Tried Dynamic @
вместо Оценить @
не повезло. может быть небольшое исправление это все что нужно? или я не использую его правильно?