Dynamic
更多信息和选项
- Dynamic[expr] 不仅可以直接显示为表达式,也可以显示为基本图形的坐标或者滑尺之类的对象,或作为选项的设置.
- 当用于通过交互运算为 expr 赋值时, Dynamic[expr] 中的表达式通常是一个符号 x、一个对象 x[i]、一个部分 e[[i]] 或者一个列表 {x,y,…}.
- 例如在图形中,Point[Dynamic[{x,y}]] 表示一个点,其坐标根据 x 和 y 的当前值动态更新.当该点交互移动时,执行 {x,y}={valx,valy} 形式的赋值. Point[Dynamic[{x,y}]] 可以交互移动; 而Dynamic[Point[{x,y}]] 不行.
- 当 Dynamic[expr] 需要 expr 值时便会对其进行计算,它确定其中任何变量值的类型,虽然有些可能已经被改变.
- 如果 Refresh 或 Clock 对象出现在 Dynamic[expr] 的表达式计算中,则 expr 将通常需要重新计算.
- Dynamic 具有属性 HoldFirst, 所以在需要显示 expr 值之前不对其进行计算.
- Dynamic[expr] 等价于 Dynamic[expr,(expr=#)&].
- Dynamic[expr,f] 使交互式运算不改变 expr,除了因为 f[val,expr] 计算.
- Dynamic[expr,None] 表示对象不能交互式改变,但是如果 expr 的值由于其它原因改变时它也会改变.
- Dynamic[expr,Temporary] 允许一个对象的显示形式在交互式运算过程中改变,但是只会在运算完成后对 expr 赋值更新.
- 对交互式鼠标操作而言,Dynamic[expr,{fstart,f,fend}] 通常在按下鼠标时计算 fstart[val,expr],然后在鼠标移动时计算 f[val,expr],然后在鼠标释放时计算 fend[val,expr].
- 如果鼠标未移动,则 fstart、f 和 fend 分别只计算一次.
- f[val,expr] 每次在 fstart[val,expr] 计算后立即进行计算,最后计算完成时,val 的值总是与 fend[val,expr] 中相同.
- 可以影响 Dynamic 对象的交互式操作包括拖曳图形中的元素或者类似 Slider 对象中的元素,以及诸如 InputField 对象中的字段编辑.
- 函数 fstart、f 和 fend 可以如下:
-
Automatic 利用 Set 赋值 None 不执行动作 Temporary 允许交互式操作以临时改变 func 计算 func[val,expr] - Dynamic[expr,f] 等价于 Dynamic[expr,{None,f,None}].
- Dynamic[expr,Temporary] 等价于 Dynamic[expr,{None,Temporary,Automatic}].
- Dynamic[expr,f] 可用于对 expr 的赋值进行约束.
- 当 expr 为类似 x+y 的表达式时,Dynamic[expr,f] 可用于为单独变量赋值.
- 一个函数 func[val,expr] 如果要为 expr 赋值就应该具有属性 HoldRest.这可以利用 Function[{v,e},body,HoldRest] 实现.
- 可以给出以下可选项:
-
BaseStyle {} 所显示的对象的基本样式指定 Deinitialization None 当 Dynamic 不能再显示时,计算的表达式 Evaluator Automatic 用于计算的核 Initialization None Dynamic 首次被显示时进行计算的表达式 ShrinkingDelay 0. 如果被显示对象缩小,在缩小前延迟多长时间 SynchronousUpdating True 是否对内容进行同步计算 TrackedSymbols All 符号变化触发更新 UpdateInterval Infinity 进行更新的时间间隔 - Dynamic[e] 在 StandardForm 和 TraditionalForm 中显示为 e 的当前的动态更新值,同 Dynamic[e] 在 InputForm 和 OutputForm 中一样.
- 出于显示的需要,Dynamic[expr] 在明确要求数值的地方提供一个模拟赋值的显示,而不是进行表达式计算.
范例
打开所有单元 关闭所有单元基本范例 (1)
范围 (24)
基本动态 (6)
Dynamic 内可以设置任意表达式:
Dynamic /@ {1 + x, "string", Graphics[{Red, Disk[]}, ImageSize -> Tiny]}Dynamic 不显示在 StandardForm 中,但仍然存在:
InputForm /@ %用 Dynamic 链接依据
的当前显示值:
Dynamic[n]Slider[Dynamic[n]]Dynamic[NIntegrate[Sin[t], {t, -Pi, n}]]SetterBar[Dynamic[n], Range[0, 1, 0.2]]Dynamic[Plot[Sin[(n + 1) x], {x, 0, 6}]]在默认情况下,Dynamic 中的变量不是局部变量:
{Slider[Dynamic[x]], Dynamic[x]}用 DynamicModule 设定局部变量:
{DynamicModule[{x}, {Slider[Dynamic[x]], Dynamic[x]}], Dynamic[x]}{DynamicModule[{x = 0.5}, {Slider[Dynamic[x]], Dynamic[x]}], Dynamic[x]}Dynamic 表达式可以自触发:
DynamicModule[{x = 1}, Dynamic[x = Max[0, x - 0.01]]]与 Slider 共用:
DynamicModule[{x = 1}, {Slider[Dynamic[x]], Dynamic[x = Max[0, x - 0.01]]}]诸如 RandomReal 和 DateString 的表达式不会自动更新:
Dynamic[RandomReal[]]Dynamic[DateString[]]用 UpdateInterval 指定动态更新:
Dynamic[RandomReal[], UpdateInterval -> 1 / 2]Dynamic[DateString[], UpdateInterval -> 1]Dynamic 保持它的变量,并且除非作为输出显示,否则不计算它:
Dynamic[a = 5];由于上面的 Dynamic 从未显示,因此不执行赋值:
a放置动态 (3)
Plot 需要特定数值来生成输出:
DynamicModule[{x}, {Slider[Dynamic[x], {1, 5}], Plot[Sin[Dynamic[x]i], {i, 0, 2Pi}]}]DynamicModule[{x}, {Slider[Dynamic[x], {1, 5}], Dynamic[Plot[Sin[x i], {i, 0, 2Pi}]]}]不同的 Dynamic 表达式分别更新,这样可以提高效率:
x = Plot3D[Sin[n m], {n, 0, 4}, {m, 0, 4}];Slider[Dynamic[y]]TabView[{{Dynamic[x], Dynamic[y]}, Dynamic[{x, y}]}]把 Dynamic 置于图形坐标周围,用图形作为控件输入:
{DynamicModule[{p = {0, 0}}, Framed@Graphics[{Locator[Dynamic[p]]}, PlotRange -> 1, PlotLabel -> Dynamic[p]]], DynamicModule[{p = {0, 0}}, Framed@Graphics[{Dynamic[Locator[p]]}, PlotRange -> 1, PlotLabel -> Dynamic[p]]]}DynamicModule[{p1 = {0, 0}, p2 = {1, 0}, p3 = {0, 1}}, {Framed@Graphics[Polygon[{Dynamic[p1], Dynamic[p2], Dynamic[p3]}], PlotRange -> 1], Column[Slider2D[#, {-1, 1}]& /@ {Dynamic[p1], Dynamic[p2], Dynamic[p3]}]}]交互式动态 (8)
用 Dynamic 连接有交互式控制的变量,例如 Slider:
{Slider[Dynamic[x]], Dynamic[x]}{Slider2D[Dynamic[x]], Dynamic[x]}{InputField[Dynamic[x]], Dynamic[x]}{ColorSlider[Dynamic[x]], Dynamic[x]}{PopupMenu[Dynamic[x], Range[10]], Dynamic[x]}DynamicModule[{x = {0, 0}}, {Graphics[Locator[Dynamic[x]], PlotRange -> 1], Dynamic[x]}]d = Table[Graphics[Disk[], ImageSize -> t], {t, {10, 20, 30, 40}}]{TabView[d, Dynamic[x]], Dynamic[x]}{FlipView[d, Dynamic[x]], Dynamic[x]}{PopupView[d, Dynamic[x]], Dynamic[x]}{OpenerView[{Disk, d}, Dynamic[t]], Dynamic[t]}用 Dynamic 设置前端的选项,如 ImageSize:
Column[{PopupMenu[Dynamic[size], {Tiny, Small, Medium, Large}], Graphics[Disk[], ImageSize -> Dynamic[size]]}]高级动态 (7)
在默认情况下,Dynamic 用在交互元素中时执行赋值运算:
{Slider[Dynamic[x]], Dynamic[x]}{Slider[Dynamic[y, (y = #)&]], Dynamic[y]}{Slider[Dynamic[z, Automatic]], Dynamic[z]}col = None;{Slider[Dynamic[x, (col = Blue;x = #)&], Background -> Dynamic[col]], Dynamic[x]}col = None;{Slider[Dynamic[x, {(col = Blue;x = #)&, (col = Green)&}], Background -> Dynamic[col]], Dynamic[x]}x = 0.5;{Slider[Dynamic[x, {(y = x)&, (x = #)&, (x = y)&}]], Dynamic[x]}用 Temporary 在交互作用结束时更新动态变量:
{Slider[Dynamic[x, Temporary]], Dynamic[x]}用 None 拒绝更新动态变量:
{Slider[Dynamic[x, None]], Dynamic[x]}Dynamic 还为可交互式设置的前端选项执行分配操作:
DynamicModule[{pt = {2, 4, 2}}, Column[{Dynamic[pt], Graphics3D[Cuboid[], ViewPoint -> Dynamic[pt]]}]]选项 (10)
BaseStyle (1)
Deinitialization (1)
Evaluator (1)
指定只在名称为 "Local" 的核内运行的 Dynamic:
Dynamic[$CommandLine, Evaluator -> "Local"]ExcludedContexts (1)
x := $TimeZone
Dynamic[x, SaveDefinitions -> True]//ToBoxes用 ExcludedContexts{} 保存所有非保护符号的定义:
Dynamic[x, ExcludedContexts -> {}, SaveDefinitions -> True]//ToBoxesIncludedContexts (1)
Initialization (2)
f[x_] := Range[x]Dynamic[f[10]]用 Initialization 计算在显示输出时需要的表达式:
Dynamic[g[10], Initialization :> (g[x_] := Range[x])]ShrinkingDelay (1)
SetterBar[Dynamic[h], {Graphics[Disk[], ImageSize -> Tiny] -> "Graphics", 1 -> "Number"}]用 ShrinkingDelay 允许收缩输出尺寸前减少时间:
Framed /@ {Dynamic[h], Dynamic[h, ShrinkingDelay -> 2]}SynchronousUpdating (1)
应用 (5)
DynamicModule[{p = {0, 1}}, Graphics[{Dashed, Circle[], PointSize[0.1], Point[Dynamic[p, (p = Normalize[#])&]]}, ImageSize -> Tiny, PlotRange -> 1.2]]DynamicModule[{a = 0, b = 0, s = {{5, 30}, {1, Infinity}}}, Deploy[Style[Panel[Grid[Transpose[{{Style["input a number", Red], Style["input another number", Red], "here is their sum", "their difference", "their product"}, {InputField[Dynamic[a], Number], InputField[Dynamic[b], Number], InputField[Dynamic[a + b], Enabled -> False], InputField[Dynamic[a - b], Enabled -> False], InputField[Dynamic[a b], Enabled -> False]}}], Alignment -> Right], ImageMargins -> 10], DefaultOptions -> {InputField -> {ContinuousAction -> True, FieldSize -> s}}]]]生成一个定时器跟踪间隔时间(分秒),用 Trigger 作为控件:
{Trigger[Dynamic[x, (a = FractionalPart[#];x = Round[#])&], {0, Infinity}], Dynamic[{Quotient[x, 60], Mod[x, 60], SetPrecision[10a, 2]}]}DynamicModule[{c}, {PopupMenu[Dynamic[c], CountryData[]], Dynamic[CountryData[c, "Shape"], SynchronousUpdating -> False]}]
| |
DynamicModule[{angle = 0, p = {1, 0}}, {LocatorPane[Dynamic[p, (angle = ArcTan@@#;p = {Cos[angle], Sin[angle]})&], Graphics[{Circle[], Arrowheads[0.15], Arrow[Dynamic[{{0, 0}, p}]]}, ImageSize -> Tiny], Appearance -> None], Dynamic[angle]}]DynamicModule[{angle = 0, p = {1, 0}, angleCalc}, {LocatorPane[Dynamic[p, (angleCalc@@Normalize /@ {#, p})&], Graphics[{Circle[], Arrowheads[0.15], Arrow[Dynamic[{{0, 0}, p}]]}, ImageSize -> Tiny], Appearance -> None], Dynamic[angle]}, Initialization :> (angleCalc[newp_, oldp_] := (angle = angle + ArcCos[newp.oldp]Sign[Cross[newp].(newp - oldp)];p = {Cos[angle], Sin[angle]}))]属性和关系 (4)
Dynamic 可用于直接显示其内容:
DynamicModule[{x = 0}, Dynamic[x]]只显示的 Dynamic 并没有交互性,第二个参数对它没有影响:
DynamicModule[{x = 0}, Dynamic[x, (x = 1)&]]另外,可将 Dynamic 作为一个值赋给交互控件、对象或选项:
DynamicModule[{x = 0}, Slider[Dynamic[x]]]当交互式改变值时,作为值使用的 Dynamic 会调用第二个参数:
DynamicModule[{x = 0}, Slider[Dynamic[x, (x = 1)&]]]x=.;
result = Dynamic[x = 5];
Print["x = ", x]result
Print["x = ", x];如果时机很重要,则需使用 FinishDynamic:
Dynamic[y = 10]
FinishDynamic[]
Print["y = ", y];同步发生的动态根据 DynamicEvaluationTimeout 的值受时间限制:
Style[Dynamic[Pause[2];"result"], DynamicEvaluationTimeout -> 1]若某运算动态使用 $DynamicEvaluation 计算,则其可以检测:
{Dynamic[$DynamicEvaluation], $DynamicEvaluation}可能存在的问题 (5)
{Slider[Dynamic[1 - x]], Dynamic[x]}用 Dynamic 的第二自变量控制赋值运算:
{Slider[Dynamic[1 - y, (y = 1 - #)&]], Dynamic[y]}自触发 Dynamic 可以很容易造成无限循环(删除该输出使之停止):
DynamicModule[{x = 1}, Dynamic[x = x + 1]]Timing[MenuView[(# -> PolyhedronData[#])& /@ PolyhedronData["Uniform"]]]用 Dynamic 和 ImageSize->Automatic 只在显示时生成内容:
Timing[MenuView[(# -> Dynamic[PolyhedronData[#]])& /@ PolyhedronData["Uniform"], ImageSize -> Automatic]]没有初始化 Module 变量,返回 Module 变量泄漏了符号的名称:
Module[{x = 5}, Dynamic[x]]
FinishDynamic[];
Quit[]通常,应使用 DynamicModule 把变量初始化和本地化:
DynamicModule[{x = 5}, Dynamic[x]]
FinishDynamic[];
Quit[]Dynamic[Module[{x = 5}, x]]
FinishDynamic[];
Quit[]默认情况下,附加到 "System`" 符号的定义不会被引入:
x := Subscript[y, 1]
Subscript[y, 1] := 17
Options[Dynamic[x, SaveDefinitions -> True]//ToBoxes, Initialization]用 ExcludedContexts{} 将所有上下文中的定义都加进来:
Options[Dynamic[x, SaveDefinitions -> True, ExcludedContexts -> {}]//ToBoxes, Initialization]Clear[Subscript]
y/:Subscript[y, 1] = 17
Options[Dynamic[x, SaveDefinitions -> True]//ToBoxes, Initialization]巧妙范例 (6)
成对的 Slider:
{Slider[Dynamic[x]], Slider[Dynamic[1 - x, (x = 1 - #)&]]}成对的 Slider2D:
{Slider2D[Dynamic[r], {-1, 1}], Slider2D[Dynamic[Through[{Cos, Sin}[ArcTan@@r]], (r = Normalize[#])&], {-1, 1}], Slider2D[Dynamic[{r[[1]], Sin[r[[1]] Pi]}, (r = {#[[1]], Sin[#[[1]] Pi]})&], {-1, 1}], Slider2D[Dynamic[{r[[1]], Cos[r[[1]] Pi]}, (r = {#[[1]], Cos[#[[1]] Pi]})&], {-1, 1}]}一个“下垂”的 Slider:
DynamicModule[{x = 1}, {Slider[Dynamic[x]], Dynamic[x = Max[0, x - 0.01]]}]Framed@Graphics[Disk[Dynamic[MousePosition[{"Graphics", Graphics}, {0, 0}]], 0.2], PlotRange -> 2]DynamicModule[{pt = {0, 0}}, Framed@Graphics[Disk[Dynamic[pt = MousePosition[{"Graphics", Graphics}, pt];pt], 0.2], PlotRange -> 2]]Framed@DynamicModule[{contents = {}}, EventHandler[Graphics[{PointSize[0.1], Point[Dynamic[contents = Map[If[#[[1, 2]] ≥ 0, {#[[1]] - #[[2]], #[[2]] + {0, 0.001}}, {{#[[1, 1]], 0}, {1, -0.8}#[[2]]}]&, contents];Map[First, contents]]]}, PlotRange -> {{0, 1}, {0, 1}}], "MouseDown" :> (AppendTo[contents, {MousePosition["Graphics"], {0, 0}}])]]相关的工作流程
- 把自动更新的动态内容放到笔记本中 ▪
- 使用定位器控件 ▪
- 构建一个 Manipulate ▪
- 避免动态内容警告 ▪
- 动态监测变量的值
相关链接
文本
Wolfram Research (2007),Dynamic,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Dynamic.html.
CMS
Wolfram 语言. 2007. "Dynamic." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/Dynamic.html.
APA
Wolfram 语言. (2007). Dynamic. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/Dynamic.html 年
BibTeX
@misc{reference.wolfram_2026_dynamic, author="Wolfram Research", title="{Dynamic}", year="2007", howpublished="\url{https://reference.wolfram.com/language/ref/Dynamic.html}", note=[Accessed: 07-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_dynamic, organization={Wolfram Research}, title={Dynamic}, year={2007}, url={https://reference.wolfram.com/language/ref/Dynamic.html}, note=[Accessed: 07-September-2026]}