Wolfram mathematica Mathematica中操纵[]的自定义控制器

Wolfram mathematica Mathematica中操纵[]的自定义控制器,wolfram-mathematica,Wolfram Mathematica,我已经创建了一个函数测试[],如果需要的话,它也可以是一个符号测试,我正试图在一个控制台中实现它。test[]如下所示: test[]:=Button["Label",Functionality[]]; 如果直接在操纵[]中使用,则会返回错误,但如果将其包装在动态或求值中,则会返回错误 Manipulate[content,test[]]; Operate::vsform:Operate参数测试[]没有变量规范的正确形式 这个有效 Manipulate[content,Evaluate[te

我已经创建了一个函数测试[],如果需要的话,它也可以是一个符号测试,我正试图在一个控制台中实现它。test[]如下所示:

test[]:=Button["Label",Functionality[]];
如果直接在操纵[]中使用,则会返回错误,但如果将其包装在动态或求值中,则会返回错误

Manipulate[content,test[]];
Operate::vsform:Operate参数测试[]没有变量规范的正确形式

这个有效

Manipulate[content,Evaluate[test]]
请注意,虽然这样做有效,但test不是一个函数

Manipulate[content,Evaluate[test[]]]
这在我的mac电脑上工作,但在我的工作电脑上不工作

我认为这个问题与操纵HoldAll有关,但我不明白为什么Dynamic[]应该解决这个问题。此外,Evaluate[]只在部分时间有效


那么,为什么需要动态[]或求值[]?查看“高级操纵”教程的“自定义控制器”部分,我看不到对此问题的任何引用,在其他地方也找不到任何引用。

您可以内联
按钮,而不是使用单独的
测试[]
函数。否则,上一个示例,
操纵[content,Evaluate[test[]]]
,在Mathematica 8中显示了我的机器上的按钮。平台(Windows或Mac)之间应该没有区别

如果您所做的操作与
操作
默认提供的操作完全不同,您可能会发现使用
动态
从头开始构建它更方便(这是我通常做的)


下面是一个如何将一些按钮包含为控制器的示例

首先,设置要在
操作中显示的内容:

rotate90[{x_, y_}] := {-y, x}

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1], 
  koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]}

koch[p1_, p2_, 0] := Line[{p1, p2}]

snowflake[n_] := 
 Graphics[{koch[{0, 0}, {1, 0}, n], 
   koch[{1, 0}, {1/2, -Sqrt[3]/2}, n], 
   koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}]
然后设置
操作
本身:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]]


下面的示例显示,即使在一个单独的函数中定义了
按钮
,此功能仍有效:

SetAttributes[paletteButton, HoldRest]
paletteButton[name_, func_] := 
 Button[name, func, Appearance -> "Palette"]

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Evaluate@paletteButton["+", n++]]

正如您在问题中提到的,这里需要将函数包装在
Evaluate
中,以获得内联
按钮。否则,
操纵
将无法注意到我们这里的是一个控件而不是一个变量。

您能否发布完整的、自包含的工作代码,以便复制和粘贴?包括所有的定义吗?举一个小例子说明问题所在。从这里到那里显示一行,带有未定义的符号,这很难帮助您。我看不出你所说的对你有什么实际作用。但是您没有显示完整的代码,因此可能还有其他问题。
SetAttributes[paletteButton, HoldRest]
paletteButton[name_, func_] := 
 Button[name, func, Appearance -> "Palette"]

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Evaluate@paletteButton["+", n++]]