2010-12-09 10 views
6

während der Berechnung würde ich den Wert der Fortschrittsbalken aktualisieren, um den Benutzer den Fortschritt der Berechnung mitzuteilen.Aktualisieren Sie eine Fortschrittsleiste in Mathematica

Leider bin ich nicht in der Lage dieses zu tun, denn wenn ich SetPropertyValue Funktion

[email protected][{"bar", "value"}, 70]; 

der Wert rufen nicht aktualisiert wird.

I erhalten ref auf diese Weise

ref = GUIRun[mainWindow]; 

Antwort

1

Haben Sie

Needs["GUIKit`"]; 

vor dem Start des GUIKit verwenden auszuführen erinnern? Wenn nicht, werden Ihre Befehle nicht ausgeführt, weil sie nicht bekannt sind. Wenn Sie das GUIKit nach dem Start laden, vergessen Sie nicht, dass einige seiner Symbole durch die Symbole, die Sie versehentlich definiert haben, beschattet werden.

+0

Danke, das habe ich schon getan. – pAkY88

9

Mit Mathematica 6 oder später versuchen, mit Monitor- und Progress anstelle des älteren GUIKit Pakets:

With[{count = 1000}, 
Monitor[Do[Pause[0.01];, {i, count}], 
    ProgressIndicator[Dynamic[i/count]]]] 
+0

Das Problem ist, dass ich die Fortschrittsanzeige in der Berechnung aktualisieren würde, und ich kann die Berechnungszeit nicht vorhersagen, also würde ich den Fortschrittsanzeigestatus dynamisch aktualisieren, zum Beispiel wenn einige Ereignisse auftreten. Wie kann ich das tun? – pAkY88

+0

Ich bin mir nicht sicher, ob ich deine Nachfolgefrage vollständig verstehe. Der i/count-Ausdruck in Dynamic wird immer dann neu ausgewertet, wenn Änderungen gezählt oder gezählt werden. Sie müssen also nicht wissen, welcher Zählwert voraus ist, da Sie den Wert während der Berechnung einfach aktualisieren können. Außerdem muss das zweite Argument von Monitor kein ProgressIndicator sein. Wenn Sie den maximalen Wert, den Sie verwenden, nicht kennen, aber Sie trotzdem die Auswertung überwachen möchten, können Sie etwas wie Dynamic [i] verwenden und der aktuelle Wert von i wird angezeigt und aktualisiert. – ragfield

6

Dies ist nur eine Erweiterung @ ragfield Antwort.

Clear["Global`*"]; 
count = 0; inRange = 0; i = 0; sumTgt = 10^5 
Monitor[ 
    While[count < sumTgt, 
    If[.14 < (rand = RandomReal[]) < .15, inRange++]; 
    count += rand; 
    ] 
    , {{"SumTillNow", ProgressIndicator[count, {0, sumTgt} ],count}, 
    {"InRange", ProgressIndicator[inRange, Indeterminate],inRange}} 
    // MatrixForm 
]; 

Wenn Sie die Fortschrittsindikatoren als animiertes gif für presententations und so speichern möchten, können Sie ändern:

Wenn Sie beschränkte und unbeschränkte Größen darstellen wollen, colud Sie etwas in dieser Richtung tun es ist ein bisschen:

count = 0; inRange = 0; i = 0; sumTgt = 10^4 
Monitor[ 
    While[count < sumTgt, 
    If[.14 < (rand = RandomReal[]) < .15, inRange++]; 
    count += rand; 
    ] 
    , a[++i] = Grid[ 
       {{"SumTillNow", ProgressIndicator[count, {0, sumTgt}],count},  
        {"InRange", ProgressIndicator[inRange, Indeterminate],inRange + 0.}}, 
       Frame -> All, Alignment -> {{Left, Center, Right}}, 
       ItemSize -> {{Automatic, Automatic, 8}}]; 
]; 
Export["c:\Anim.gif", Table[a[j]//MatrixForm, {j, i}],"DisplayDurations"->{.3}] 

und das Ergebnis ist:

alt text

Verwandte Themen