Re: ProgressIndicator inside DynamicModule
- To: mathgroup at smc.vnet.net
- Subject: [mg109843] Re: ProgressIndicator inside DynamicModule
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 19 May 2010 20:13:57 -0400 (EDT)
Hi Istvan,
Alas, can not answer your questions properly, but the following modification
of your code
seems to also work fine:
DynamicModule[{range == {0, 100}, sw == False},
Module[{pr == 0},
Grid@{{
Button["Push me",
(sw == True;
Do[pr == i; Pause[.02];, {i, range[[1]], range[[2]]}];
sw == False;), Method -> "Queued"],
Dynamic@ProgressIndicator[pr, range],
Dynamic@pr,
Dynamic@Switch[sw,
True, "Calculating...",
False, "Finished.",
_, "Standing by."]}}]]
The issue seems to be with the <pr> variable. My guess is that by
localizing <pr> with DynamicModule vs plain Module or not localizing at all,
you somehow indicate to Dynamic that <pr> is going to change due to Dynamic
updating, so Dynamic does not track its possible changes by other means
(like by explicit assignments in a loop that you have). My guess is
supported by observing that once you localize with DynamicModule,
1. Dynamic@ProgressIndicator[pr, range], works while
ProgressIndicator[Dynamic[pr], range] does not
2. Consider the following modification:
ClearAll[f];
DynamicModule[{pr == 0, range == {0, 100}, sw == False},
Grid@{{
Button["Push me",
(sw == True;
Do[pr == i; Pause[.02];, {i, range[[1]], range[[2]]}];
sw == False;), Method -> "Queued"],
Dynamic@ProgressIndicator[pr, range],
Dynamic[f[pr]],
Dynamic@Switch[sw,
True, "Calculating...",
False, "Finished.",
_, "Standing by."]}}]
You will observe that now the value of <pr> inside <f> is being properly
updated inside Dynamic during the run of your code. In particular, by using
f[x_]:==x, you can get back the desired result - you can even localize <f>
as well as put this definition inside the same DynamicModule (although this
is certainly a hack). In both cases, we replaced Dynamic[pr] with something
else, which apparently made Dynamic properly update the output. Of course,
my observations at best somewhat clarify "how", but not "why" - hopefully
others will have more to say here.
Hope this helps.
Regards,
Leonid
2010/5/19 Zachar Istv=E1n <replicatorzed at gmail.com>
> Dear Group,
>
> dealing with dynamic functions is very frustrating: every now and then
> a problem appears, which is totally against my previous experience and
> knowledge, and I am simply not able to resolve it. Here is a new one,
> any help would be welcome.
>
> Why does ProgressIndicator won't work inside DynamicModule, where
> 1. it works without enclosing the Grid in DynamicModule,
> 2. the 'sw' switch is correctly displayed (but not 'pr').
> ??
>
> DynamicModule[
> {pr == 0, range == {0, 100}, sw == False},
> Grid@{{
> Button["Push me",
> (sw == True;
> Do[pr == i; Pause[.02];, {i, range[[1]], range[[2]]}];
> sw == False;), Method -> "Queued"],
> Dynamic@ProgressIndicator[Dynamic@pr, range],
> Dynamic@pr,
> Dynamic@Switch[sw, True, "Calculating...", False, "Finished.", _,
> "Standing by."]
> }}
> ]
>
>
> Thanks in advance
> Istvan
>
>