DynamicModule[{x,y,…},expr]
表示一个对象,可保持 expr 中所有 Dynamic 对象在计算过程中符号 x、y、… 的局部值. 在默认情况下, DynamicModule 中指定的符号甚至在整个 Mathematica 进程中都不会改变其值.
DynamicModule[{x=x0,y=y0,…},expr]
为 x、y、… 指定初始值.
DynamicModule
DynamicModule[{x,y,…},expr]
表示一个对象,可保持 expr 中所有 Dynamic 对象在计算过程中符号 x、y、… 的局部值. 在默认情况下, DynamicModule 中指定的符号甚至在整个 Mathematica 进程中都不会改变其值.
DynamicModule[{x=x0,y=y0,…},expr]
为 x、y、… 指定初始值.
更多信息和选项
- DynamicModule 首先为 expr 中的局部变量给出特定名称,如同 Module,然后计算得出的表达式,然后返回其封闭在 DynamicModule 中的新形式.
- 在一个笔记本中,它返回的形式通常显示在输出单元中,例如从 Manipulate 输出.
- 在一个 DynamicModule 结果的显示形式中,如果交互式改变或编辑 Dynamic 对象,使局部变量的任意值发生了改变,则 DynamicModule 对象相应作出反应.
- 当一个包含 DynamicModule 的笔记本保存时,一个 DynamicModule 中的局部变量值自动默认保存,使这些值在整个 Mathematica 进程实际上保持一致.
- 如果您复制一份包含 DynamicModule 对象在内的笔记本,副本中的局部变量将独立于原件中的局部变量,尽管它们的初始值相同.
- 可以给出以下选项:
-
BaseStyle {} 所显示的对象的基本样式指定 Deinitialization None 当 DynamicModule 不能再被显示时计算的表达式 DynamicModuleValues Automatic 对变量值,动态更新数据 ExcludedContexts Automatic SaveDefinitions 中排除的上下文 InheritScope False 将 DynamicModule 变量与另一个 DynamicModule 实例连接 IncludedContexts All SaveDefinitions 中包含的上下文 Initialization None DynamicModule 首次被显示时,计算的表达式 SaveDefinitions False 是否保存所有与 expr 相关的定义 SynchronousInitialization True 是否同步执行初始化 UndoTrackedVariables None 当变化时,应由前端的撤消机制来跟踪的变量 UnsavedVariables None 数值不应被保存的变量 - 当 DynamicModule 首次进行计算时,在计算过程中进行局部变量的初始赋值,然后只有当显示 DynamicModule 的输出时计算 Initialization 选项的任意设置.
- 当一个 DynamicModule 对象在某个特定笔记本中首次显示时,局部变量的保存值被恢复,然后计算 Initialization 选项的任意设置.
- 局部变量的全部数值被保存, 除了包括在 UnsavedVariables 列表中的变量. 符号的普通数值保存在 DynamicModule的第一个参数中;其它数值被保存在 DynamicModuleValues 选项的设置中.
- DynamicModule 具有属性 HoldAll.
- DynamicModule 结构可以任意嵌套,如果需要可以重新命名内部变量.
- DynamicModule 是一个作用域结构,以实现词汇的作用域.
范例
打开所有单元 关闭所有单元基本范例 (1)
生成一个带有动态更新的局部变量的 Slider:
DynamicModule[{x}, {Slider[Dynamic[x]], Dynamic[x]}]范围 (6)
DynamicModule 变量 (3)
利用 DynamicModule 确定变量并防止与其相应的全局变量发生冲突:
{Slider[Dynamic[x]], Dynamic[x]}DynamicModule[{x}, {Slider[Dynamic[x]], Dynamic[x]}]{Slider[Dynamic[x]], Dynamic[x]}%DynamicModule[{x}, {Slider[Dynamic[x]], Dynamic[x]}]%为局部变量赋初始值,例如 Module:
DynamicModule[{a = 3, b = 2, c = 1}, {a, b, c}.x ^ Range[3]]DynamicModule[{f, p}, f[g_] := Graphics[g, ImageSize -> Tiny];{SetterBar[Dynamic[p], {Disk[] -> Disk, Rectangle[] -> Rectangle}], Dynamic[f[p]]}]DynamicModule 状态 (3)
在不同的 Mathematica 进程中,用 DynamicModule 保存显示状态:
DynamicModule[{x = 1}, Slider[Dynamic[x]]]InputForm[ToBoxes[%]]Module 仅给出当前 Mathematica 进程的单一状态:
Module[{x = 1}, Slider[Dynamic[x]]]InputForm[ToBoxes[%]]在显示内容前,用 Initialization 计算表达式:
DynamicModule[{x = .5}, Slider[Dynamic[x]], Initialization :> (SelectionMove[EvaluationNotebook[], All, EvaluationCell];SetOptions[NotebookSelection[], CellFrame -> 1, CellFrameColor -> Hue[x]])]Initialization 的计算是在局部变量赋值后:
DynamicModule[{a = 2}, Dynamic@a, Initialization :> (a = 1)]推广和延伸 (1)
选项 (16)
BaseStyle (1)
Deinitialization (1)
DynamicModuleValues (1)
局部变量的函数定义自动插入到 DynamicModuleValues:
InputForm[DynamicModule[{c}, c[x_] := {x};c[1]]]ExcludedContexts (1)
x := $TimeZone
DynamicModule[{x}, x, SaveDefinitions -> True]//ToBoxes用 ExcludedContexts{} 保存所有非保护符号的定义:
DynamicModule[{x}, x, ExcludedContexts -> {}, SaveDefinitions -> True]//ToBoxesInheritScope (1)
用 DynamicModule 创建一个对话框,继承来自父 DynamicModule 的变量:
DynamicModule[{a = 1}, {Dynamic[a], Button["dialog", CreateDialog[DynamicModule[{}, Button["a++", a++], InheritScope -> True]]]}]Initialization (4)
f[x_] := {x}DynamicModule[{c}, {Slider[Dynamic[c]], Dynamic[f[c]]}]用 Initialization 保存内容中所需的计算:
DynamicModule[{c}, {Slider[Dynamic[c]], Dynamic[g[c]]}, Initialization :> (g[x_] := {x})]DynamicModule[{c = 0.2, g},
{Slider[Dynamic[c]], Dynamic[g[c]]}, Initialization :> (g[x_] := {x})]DynamicModule[{}, 1, Initialization :> (x = 2)];DynamicModule[{}, 2, Initialization :> (y = 3)]第一个 DynamicModule 受分号抑制,所以它无法运行赋值:
{x, y}IncludedContexts (1)
SaveDefinitions (2)
f[x_] := xDynamicModule[{u = 5}, Dynamic[f[u]]]通过设置 SaveDefinitions 为 True,外部定义通过输出保存:
f[x_] := xDynamicModule[{u = 5}, Dynamic[f[u]], SaveDefinitions -> True]SynchronousInitialization (2)
DynamicModule[{c = 0.2, g}, {Slider[Dynamic[c]], Dynamic[g[c]]}, Initialization :> (Pause[2];g[x_] := {x})]DynamicModule[{c = 0.2}, {Slider[Dynamic[c]], Dynamic[g[c]]}, Initialization :> (Pause[2];g[x_] := {x}), SynchronousInitialization -> False]UndoTrackedVariables (1)
UnsavedVariables (1)
dm = DynamicModule[{x, y}, Column@{Slider[Dynamic[x]], Slider[Dynamic[y]], Dynamic[{x, y}]}, UnsavedVariables -> {y}];nb = DialogInput[{dm, Button["Close", DialogReturn[NotebookGet[]]]}];nb = DialogInput[nb];应用 (3)
DynamicModule[{a = 0, b = 0}, 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 -> {{5, 30}, {1, Infinity}}}}]]]DynamicModule[{pts = {{0, 0}, {1, 1}, {2, 0}, {3, 2}}}, LocatorPane[Dynamic[pts], Dynamic[Plot[InterpolatingPolynomial[pts, x], {x, 0, 3}, PlotRange -> 3]]]]angularSlider[Dynamic[angle_]] := DynamicModule[{p = {1, 0}, angleCalc}, LocatorPane[Dynamic[p, (angleCalc@@Normalize /@ {#, p})&], Graphics[{Circle[], Arrowheads[0.15], Arrow[Dynamic[{{0, 0}, p}]]}, ImageSize -> Tiny], Appearance -> None], Initialization :> (angle = 0;angleCalc[newp_, oldp_] := (angle = angle + Abs[ArcCos[newp.oldp]]Sign[Cross[newp].(newp - oldp)];p = {Cos[angle], Sin[angle]}))]{angularSlider[Dynamic[θ]], Dynamic[θ]}DynamicModule[{θ = 0}, Grid[{{angularSlider[Dynamic[θ]], Plot[Sin[x], {x, -10, 10}, Epilog -> {PointSize[Medium], Dynamic@Point[{θ, Sin[θ]}]}]}, {ParametricPlot[{Cos[y], y}, {y, -10, 10}, AspectRatio -> 2, Epilog -> {PointSize[Medium], Dynamic@Point[{Cos[θ], θ}]}], Dynamic[θ]}}]]用 PolarPlot 证明螺旋曲线:
DynamicModule[{θ = 0}, Grid[{{angularSlider[Dynamic[θ]], Dynamic@PolarPlot[t, {t, -Pi, θ}, ImageSize -> Tiny]}}]]属性和关系 (2)
DynamicModule 和 Module 尽管表面相似但本质不同:
DynamicModule[{x}, {x, Slider[Dynamic[x]], Dynamic[x]}]%在这个范例中两个滑尺都会移动,当重新打开时如果不计算同样不起作用:
Module[{x}, {x, Slider[Dynamic[x]], Dynamic[x]}]%Manipulate 依据 DynamicModule 生成输出:
Manipulate[x, {x, 0, 1}]DynamicModule[{x}, {Slider[Dynamic[x]], Dynamic[x]}]可能存在的问题 (2)
默认情况下,不会引入附加到 "System`" 符号上的定义:
x := Subscript[y, 1]
Subscript[y, 1] := 17
Options[DynamicModule[{x}, x, SaveDefinitions -> True]//ToBoxes, Initialization]用 ExcludedContexts{} 从所有上下文中提取定义:
Options[DynamicModule[{x}, x, SaveDefinitions -> True, ExcludedContexts -> {}]//ToBoxes, Initialization]Clear[Subscript]
y/:Subscript[y, 1] = 17
Options[DynamicModule[{x}, x, SaveDefinitions -> True]//ToBoxes, Initialization]在动态模块中使用外部声明的 Module 变量会造成范围冲突:
Module[{outer = 1}, DynamicModule[{inner = Hold[outer]}, Dynamic[ReleaseHold[inner]]]]框符引用了一个泄露的临时 Module 符号,内核退出后,符号将没有值:
ToBoxes[%, StandardForm]用 With 注入被完全解析的 Module 符号,使其不被框符引用:
Module[{outer = 1}, With[{tmp = outer}, DynamicModule[{inner = Hold[tmp]}, Dynamic[ReleaseHold[tmp]]]]]ToBoxes[%, StandardForm]巧妙范例 (2)
Expand[(DynamicModule[{x}, Slider2D[Dynamic[x]]] + 1) ^ 3]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}}, ImageSize -> 80], "MouseDown" :> (AppendTo[contents, {MousePosition["Graphics"], {0, 0}}])]](% + 1) ^ 3//Expand相关的工作流程
- 把自动更新的动态内容放到笔记本中 ▪
- 使用定位器控件
文本
Wolfram Research (2007),DynamicModule,Wolfram 语言函数,https://reference.wolfram.com/language/ref/DynamicModule.html (更新于 2021 年).
CMS
Wolfram 语言. 2007. "DynamicModule." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2021. https://reference.wolfram.com/language/ref/DynamicModule.html.
APA
Wolfram 语言. (2007). DynamicModule. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/DynamicModule.html 年
BibTeX
@misc{reference.wolfram_2026_dynamicmodule, author="Wolfram Research", title="{DynamicModule}", year="2021", howpublished="\url{https://reference.wolfram.com/language/ref/DynamicModule.html}", note=[Accessed: 13-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_dynamicmodule, organization={Wolfram Research}, title={DynamicModule}, year={2021}, url={https://reference.wolfram.com/language/ref/DynamicModule.html}, note=[Accessed: 13-September-2026]}