广义的输入
广义的输入
Table[n!, {n, 1, 10}]Table[(n + 3/n!), {n, 1, 10}]Table[(n + Slider[4, {1, 10, 1}]/n!), {n, 1, 10}]怎样创造这样的控件将在下一节讨论,但是首先值得注意的是,在许多情况下有比这一种输入更好的其它选择.
将这个例子铸入到一个 Manipulate 形式中能使你看到实时移动滑块的效果:
Manipulate[Table[(n + m/n!), {n, 1, 10}], {m, 1, 10, 1}]但是有一些情况是在传统的 Shift+Return 所计算的输入里面,嵌入控件会工作得更好一些. 这些情况是:如果计算很缓慢,如果你希望在控件周围编辑其余的输入行时有完全的灵活性,或者编码的目的是写定义以便稍后使用,以及使用控件指定初始值等.
例如,你希望设置一个颜色调色板,使用 ColorSetter (颜色设置)来初始化在接下来的程序中将被使用的命名的颜色:
edgeColor = ColorSetter[RGBColor[0.165468833447776, 1., 0.14567788204776075], "Swatch"];fillColor = ColorSetter[RGBColor[0.8687724116884108, 0.5116044861524376, 0.31874570840009153], "Swatch"];backgroundColor = Blend[{ColorSetter[RGBColor[1., 0.34134431982909896, 0.], "Swatch"], ColorSetter[RGBColor[0.2814373998626688, 0., 0.8914015411612116], "Swatch"]}];Graphics[{
fillColor, EdgeForm[{AbsoluteThickness[2], edgeColor}], Polygon[RandomReal[{0, 1}, {5, 3, 2}]]}, Background -> backgroundColor]你能通过计算 Slider[] 创建一个滑块:
Slider[]2 + Slider[0.5]| DynamicSetting[e] | 一个显示为 e 的对象,但是被解释为,在计算时 e 的动态更新的当前的设置 |
当 DynamicSetting (动态设置)封装一个滑块并被计算时,新的滑块看上去和最初的滑块一样,但是有计算它的当前设置这么一个隐藏的特性.
DynamicSetting[Slider[]]2 + Slider[0.5]上一节里的例子是用 DynamicSetting 以这个方式创建的.
尽管复制和粘贴能很有效地被用来建立含有控件的输入行,通常最方便的是使用 在当前位置上计算 Ctrl+Shift+Enter (在 Mac 上使用 Command+Return ) 来转化适当的控件表达式,尤其是当你对创建控件的命令熟悉时.
2 + DynamicSetting[Slider[]]然后,选中整个控件表达式.(点击三下 DynamicSetting 这个词是做这个尤其快的一个方法.)
2 + DynamicSetting[Slider[]]敲入 Ctrl+Shift+Enter (在 Mac 上使用 Command+Return ),控件表达式将在当前的位置上被转化成一个实际的控件.(注意 Ctrl+Shift+Enter 不是为计算输入而使用的正常的 Shift+Enter.)
2 + Slider[0.5]2 + Slider[0.5]所有的 Slider 的自变量可被用来改变初始值、范围和步长.
Expand[(1 + x)^DynamicSetting[Slider[5, {1, 50, 1}]]]Expand[(1 + x)^Slider[5, {1, 50, 1}]]Expand[(1 + x)^DynamicSetting[PopupMenu[5, Table[i, {i, 50}]]]]Expand[(1 + x)^PopupMenu[5, {1 -> "1", 2 -> "2", 3 -> "3", 4 -> "4", 5 -> "5", 6 -> "6", 7 -> "7", 8 -> "8",
9 -> "9", 10 -> "10", 11 -> "11", 12 -> "12", 13 -> "13", 14 -> "14", 15 -> "15", 16 -> "16",
17 -> "17", 18 -> "18", 19 -> "19", 20 -> "20", 21 -> "21", 22 -> "22", 23 -> "23", 24 -> "24",
25 -> "25", 26 -> "26", 27 -> "27", 28 -> "28", 29 -> "29", 30 -> "30", 31 -> "31", 32 -> "32",
33 -> "33", 34 -> "34", 35 -> "35", 36 -> "36", 37 -> "37", 38 -> "38", 39 -> "39", 40 -> "40",
41 -> "41", 42 -> "42", 43 -> "43", 44 -> "44", 45 -> "45", 46 -> "46", 47 -> "47", 48 -> "48",
49 -> "49", 50 -> "50"}]]注意控件表达式不像它们正常情况下一样包含对一个变量的动态参照(参看 "动态简介"). 这里描述的在输入表达式中使用的控件是静态的,惰性的对象,很像一个文本的命令. 它们不相互连接,并且在你移动一个时什么也不发生,除了它移动之外. 基本上它们只是记录它们当前的状态,为了在你计算输入行时使用.
在输入表达式中使用包含多个控件的整个面板是可行的. 构造这样的面板比只是用 DynamicSetting 封装一个单一的控件更复杂,这是因为你必须指定在模板被计算时应该如何把各种控件的数值集合到返回的数值里.
Interpretation (解释)这个函数被用来集合一个独立的输入模板对象,它可能包含许多通过动态变量来互动的内部部件. 自变量是 Interpretation[variables,body,returnvalue].
第一个自变量给出一列局部变量,带有和 Module 或 DynamicModule 形式相同的选择性的初始化.(实际上,Interpretation 在输出中创建一个 DynamicModule. 参看 "动态简介".)
| Interpretation[e,expr] | 一个显示为 e 的对象,但是如果被提供为输入它被解释为 expr 的未计算的形式 |
| Interpretation[{x=x0,y=y0,…},e,expr] | 允许局部变量在 e 和 expr 里 |
计算以下的输入单元创建一个含有一个 Plot (画图)命令的模板的输出单元:
Interpretation[{f = Sin[x], min = 0, max = 2Pi},
Panel[Grid[{
{Style["Plot", Bold], SpanFromLeft},
{"Function:", InputField[Dynamic[f]]},
{"Min:", InputField[Dynamic[min]]}, {"Max:", InputField[Dynamic[max]]}}]],
Plot[f, {x, min, max}]]DynamicModule[«3»]Interpretation[{f = x^2, var = x, definite = False, min = a, max = b}, Panel[Grid[{
{Style["Integrate", Bold], SpanFromLeft},
{"Function:", InputField[Dynamic[f], FieldSize -> {{20, Infinity}, {1, Infinity}}]},
{"Variable:", InputField[Dynamic[var]]},
{Row[{Checkbox[Dynamic[definite]], "Definite integral"}], SpanFromLeft},
{"Min:", InputField[Dynamic[min], Enabled -> Dynamic[definite]]}, {"Max:", InputField[Dynamic[max], Enabled -> Dynamic[definite]]}}]], If[definite, Integrate[f, {var, min, max}], Integrate[f, var]]]DynamicModule[«3»]为了检查积分的结果,以 D 来封装模板,求导数并核对结果,和出发点是一样的:
D[DynamicModule[«3»], x]这些例子是相当普遍的:它们看上去像许多程序设计里的对话框. 但是有一些重要的区别. 例如,注意输入区中的
. Wolfram 系统中的输入域也许看上去和其它程序设计中的一样,但是内容能够是任意排版的数学,或者甚至是图像或其它的控件.(看下一节来了解如何编写彼此嵌套的模板.)
Interpretation[{f = x^2, var = x, min = a, max = b}, Panel[Row[{
Underoverscript[Style["∫", 36],
InputField[Dynamic[min], FieldSize -> Tiny], InputField[Dynamic[max], FieldSize -> Tiny]],
InputField[Dynamic[f], FieldSize -> {{10, Infinity}, {1, Infinity}}], " ⅆ ", InputField[Dynamic[var], FieldSize -> Tiny]}]],
Integrate[f, {var, min, max}]]Subsuperscript[∫, a, b]x^2ⅆx如果在初始化中给定的变量已经被赋予了其它的数值(例如,如果在上一节中的变量 x 有一个数值),或者模板结构被粘贴到输入域里,像那些在上一节中定义的模板不会如你所希望地一样工作. 为了正确地处理计算的问题,有必要使用 InputField (输入域)对象把它们的数值保存在非解析的盒框结构形式中而不是表达式的形式中.(盒框结构代表任何可能的可显示的结构,无论它是否是Wolfram 语言合法的输入表达式,从这个意义上,盒框结构是如同符号串的.)
Interpretation[{
f = MakeBoxes[x^2],
var = MakeBoxes[x],
definite = False,
min = MakeBoxes[a],
max = MakeBoxes[b]},
Panel[Grid[{
{Style["Integrate", Bold], SpanFromLeft},
{"Function:", InputField[Dynamic[f], Boxes, FieldSize -> {{20, Infinity}, {1, Infinity}}]},
{"Variable:", InputField[Dynamic[var], Boxes]},
{Row[{Checkbox[Dynamic[definite]], "Definite integral"}], SpanFromLeft},
{"Min:", InputField[Dynamic[min], Boxes, Enabled -> Dynamic[definite]]}, {"Max:", InputField[Dynamic[max], Boxes, Enabled -> Dynamic[definite]]}}]], With[{f = ToExpression[f], var = ToExpression[var], min = ToExpression[min], max = ToExpression[max]}, If[definite, Integrate[f, {var, min, max}], Integrate[f, var]]]]DynamicModule[«3»]DynamicModule[«3»]Interpretation[{
f = MakeBoxes[x^2],
var = MakeBoxes[x],
definite = False,
min = MakeBoxes[a],
max = MakeBoxes[b]}, Panel[Row[{
Underoverscript[Style["∫", 36],
InputField[Dynamic[min], Boxes, FieldSize -> Tiny], InputField[Dynamic[max], Boxes, FieldSize -> Tiny]],
InputField[Dynamic[f], Boxes, FieldSize -> {{10, Infinity}, {1, Infinity}}], " ⅆ ", InputField[Dynamic[var], Boxes, FieldSize -> Tiny]}]],
With[{f = ToExpression[f], var = ToExpression[var], min = ToExpression[min], max = ToExpression[max]}, Integrate[f, {var, min, max}]]]图形对象,包括 Graphics、Graphics3D,画图命令的输出,以及从外部图像文件导入的图形,都能被作为输入使用并且能同文字的输入自由地混合在一起. 在混合图形、控件、排版的数学,和文字上没有任意的限制.
Plot[Sin[x], {x, 0, 2Pi}]Table[[image]Table[[image], {5}]注意图形是怎样取决于它的上下文而以各种不同的尺寸出现的. 有三个标准的自动的图形尺寸,如果图形自身是在一个输出里那么是最大的,如果在一个列单或表格输出中使用就小一些,如果是在一个文字输入行里那么是最小的. 这主要是为了便于使图形输入不太庞大. 你总是可以通过点击它和使用调整大小的句柄,或者包括一个明确的 ImageSize 选项来自由地调整图形的大小.
Import["ExampleData/peacock.tif"][image]//ColorNegate能使用图形来作为输入的能力容许非常丰富的输入,就像在这个简单的 Manipulate 的例子中一样:
Manipulate[
ImageApply[Mod[# + j, 1]&, [image]], {j, 0, 1, .01}]相关技术笔记
-
▪
- 自定义界面的构建