Re: Dependent dynamic controls
- To: mathgroup at smc.vnet.net
- Subject: [mg100628] Re: Dependent dynamic controls
- From: Albert Retey <awnl at gmx-topmail.de>
- Date: Tue, 9 Jun 2009 06:37:56 -0400 (EDT)
- References: <h02vfq$863$1@smc.vnet.net> <h0l49i$oq2$1@smc.vnet.net>
Hi, I think you can understand what happens when using some extra prints: Module[{sw = True, a, b, c, n, assign}, assign[switch_, x_] := If[switch, a = x; c = f@x; n = Position[aSet, x][[1, 1]], b = x; c = g@x; n = Position[bSet, x][[1, 1]] ]; assign[sw, First@If[sw, aSet, bSet]]; Print[{a, b, c, n}]; Panel@Column@{ Dynamic@Column@{sw, If[sw, a, b], c, n}, Grid[{{ "a", RadioButton[Dynamic[sw, (sw = #; assign[#, First@aSet]) &], True], PopupMenu[Dynamic[a, assign[sw, #] &], aSet, Enabled -> Dynamic[sw]] }, { "b", RadioButton[Dynamic[sw, (sw = #; assign[#, First@bSet]) &], False], PopupMenu[Dynamic[b, (Print[{sw, #}]; assign[sw, #]) &], bSet, Enabled -> Dynamic[! sw]] }}] } ] so what we learn is that actually everything works as intended, but then in the end the initialization of the PopupMenu calls the setter function once because b has no value yet. Whether this is what one should expect or not I don't know, maybe you can find something in the documentation. It is very easy to correct, though, by initializing b (in case sw is initialized to False you might want to also initialize a): Module[{sw = True, a = aSet[[1]], b = bSet[[1]], c, n, assign}, assign[switch_, x_] := If[switch, a = x; c = f@x; n = Position[aSet, x][[1, 1]], b = x; c = g@x; n = Position[bSet, x][[1, 1]] ]; assign[sw, First@If[sw, aSet, bSet]]; Panel@Column@{ Dynamic@Column@{sw, If[sw, a, b], c, n}, Grid[{{ "a", RadioButton[Dynamic[sw, (sw = #; assign[#, First@aSet]) &], True], PopupMenu[Dynamic[a, assign[sw, #] &], aSet, Enabled -> Dynamic[sw]] }, { "b", RadioButton[Dynamic[sw, (sw = #; assign[#, First@bSet]) &], False], PopupMenu[Dynamic[b, assign[sw, #] &], bSet, Enabled -> Dynamic[! sw]] }}] } ] I have also rearranged some Dynamics since the controls need not be recreated every time one of the variables changes. Another suggestion would be to use DynamicModule instead of just Module, but that depends also on what you really try to achieve. With Module you will create a set of variables at each call, and they will persist for the rest of the session. hth, albert