perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 28
Click for quality!




10.02.2012 / 20:17

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragProgressbar
Seitenanfang
ich habe eine progressbar im Hauptfenster zugefügt und solange eine funktion die bei mir install() heisst sollte diese Progressbar sich hin und her bewegen ich habe es mit sowas probiert aber irgendwas ist oder alles ist falsch.
##################################
my $mybar = $f_plat ->ProgressBar(
-relief => 'raised',
-borderwidth => 5,
-troughcolor=>'#BFEFFF',
-width => 30,
-colors=>[ 0, '#104E8B' ],
-length=>120,
-from =>'0',
-to => '50',
-variable => \install(),
);
$mybar -> pack(-side => 'top', -padx => '0.5c');
######################
wie könnte ich die zeile: -variable=>\install,
zum funktionieren bringen?

Gruß
suzane

Datum: 11.06.2007-16:44

Beitragre: Progressbar
Seitenanfang
Antwort siehe:
http://www.perlunity.de/cgi-bin/forum/forum_thread.cgi?tid=19999&mid=40718&fid=8&pn=0

Wie dort beschrieben: Du musst in dem Programmstueck fuer die du die Fortschrittsanzeige brauchst nach jeden Arbeitsschritt den Wert fuer die ProgressBar neu setzten, entweder ueber die Variable oder ueber die value-Funktion

Datum: 11.06.2007-17:21

Beitragre: Progressbar
Seitenanfang
Hi profis,
ich habe es nicht geschafft.

das progressbar sehe ich jetzt auf dem Fenster aber ich kann es bis jetzt nicht hin und her bewegen habt ihr eine idee wie mann es macht?
das ist mein code:

use Tk;
use Tk::ProgressBar;
my $progbar_status = 0;

my $mybar = $f_plat ->ProgressBar(
-relief => 'raised',
-borderwidth => 5,
-troughcolor=>'#BFEFFF',
-width => 30,
-colors=>[ 0, '#104E8B' ],
-length=>120,
-from =>'0',
-to => '50',
-variable => \$progbar_status,
)-> pack();

$progbar_status = 10;
# hier weiss ich nicht warum 10 auftaucht? und #wie kann ich diese variable $program_status #setzen?

Datum: 12.06.2007-16:26

Beitragre: Progressbar
Seitenanfang

#!/usr/bin/perl

use strict;
use warnings;

use Tk;
use Tk::ProgressBar;

my $pb = Tk::tkinit->ProgressBar(
-from => 0,
-to => 100)->pack;

$pb->repeat(1000 => sub { $pb->value($pb->value + 15) });

Tk::MainLoop();


Fuehrt jede Sekunde die anonyme Subroutine aus, die den Wert der ProgressBar um 15 erhoeht, dadurch wandert der Fortschrittsbalken (um 15 Prozent).

Und mit der Variablen ist es aehnlich


#!/usr/bin/perl

use strict;
use warnings;

use Tk;
use Tk::ProgressBar;

my $pb_status = 0;
my $pb = Tk::tkinit->ProgressBar(
-from => 0,
-to => 100,
-variable => \$pb_status)->pack;

$pb->repeat(1000 => sub { $pb_status += 15 });

Tk::MainLoop()

Datum: 13.06.2007-16:56

Beitragre: Progressbar
Seitenanfang
danke dir, das funktioniert gut.nur halt das funktioniert aber nach irgend eine Funktion und nicht whärend. zum beispiel:

sub status(){
$p_bar = Tk::tkinit ->ProgressBar(
-relief => 'raised',-borderwidth => 5,
-troughcolor=>'#BFEFFF',-width => 30,
-colors=>[ 0, '#104E8B' ],-length=>120,
-from =>'0',-to => '50',
-variable => \$pb_status,
)-> pack(-side => 'top', -padx => '0.5c');
$p_bar->repeat(1000 => sub { $pb_status += 1 });}

sub run_snippet($$@)
{
&status();
my($x,$y,@arr) = @_; # Input
my ($code, $check);
$y = 4;
use CGI::Carp qw(fatalsToBrowser);
$code = $arr[$x][$y];
$check = eval $code ;
if($check == '1')
{
step_done($x,$y,@arr);
}
else
{
step_failed($x,$y,@arr);
}
print "\nsnippet done\n";
}# sub run_snippet

wie könnte ich die beiden funktionen auf einmalbenutzen: das heisst während run_snippet() arbeitet die Progressbar auch arbeitet und wenn run_snippet() endet die Progressbar auch endet?
und hoffe dass dich nicht viel störe mit meinen blöden fragen.

Gruss

Datum: 13.06.2007-19:54

Beitragre: Progressbar
Seitenanfang
Du darfst den Code von mir nicht komplett in dein Script uebernehmen, ich liefere voll lauffaehige Beispiele, wobei bestimmte Aktionen simuliert werden.
Der Teil deines Programms der die einzelnen Arbeitsschritte ausfuehrt, wurde in meinen Script durch 'repeat' simuliert.
Durch 'repeat' wurde jede Sekunde die ProgressBar veraendert, so als waere in deinen Programm nach jeder Sekunde ein Arbeitsschritt abgeschlossen.

Loesche den Teil aus deinen Script den du aus meinen kopiert hast, gehe dann an die Stelle an der du deine ProgressBar erzeugst.

Entferne die Angabe von '-variable => \$pb_status' oder je nachdem wie das in deinen Script nun heiszt.

Dann gehe an die Stelle an der dein Script mit einen Arbeitsschritt fertigt ist. Dass ist nun entweder in der Sub 'run_snippet', nach dem Aufruf von 'eval' oder an der Stelle an der du 'run_snippet' aufrufst.
An diese Stelle fuegst du nun die Zeile


$pb_bar->value($pb_bar->value + $wert);

dabei ist $pb_bar mit den Variablennamen zu ersetzen der fuer deine Progressbar steht und $wert musst du mit den Wert ersetzen, um den die ProgressBar einen Schritt weiter gehen soll.


use CGI::Carp qw(fatalsToBrowser);

Ich dachte das ist eine Perl/Tk-Anwendung? Was haben dann die CGI-Sachen darin zusuchen?

Ich habe noch einmal ein Beispiel formuliert was das Ganze noch einmal etwas besser veranschaulicht.


#!/usr/bin/perl

use strict;
use warnings;

use Tk;
use Tk::ProgressBar;

my $anzahl_schritte = 7;

my $mw = MainWindow->new;

my $pb = $mw->ProgressBar(
-from => 0,
-to => 100)->pack;

$mw->Button(-text => 'Ausfuehren',
-command => \&schritte_verarbeiten
)->pack;

Tk::MainLoop();

sub schritte_verarbeiten {

for(1 .. $anzahl_schritte) {
naechster_schritt($_);
$pb->value($pb->value + 10); # ProgressBar um 10% erhoehen
$mw->update; # GUI aktualisieren
}

}

sub naechster_schritt {
print "Schritt $_[0]\tgestartet\n";

# simuliere die Verarbeitung eines Schritts
for(1 .. int(rand 10)) {
print '.';
sleep 1;
}
print "\n";

print "Schritt $_[0]\tabgeschlossen\n";
}


Da waehrend der Ausfuehrung von 'schritte_verarbeiten' die GUI nicht aktualisiert wird, muss nach jeden Arbeitsschritt erst die ProgressBar neugesetzt und dann mit '$mw->update' die GUI aktualisiert werden, sonst aendert sich die Anzeige nicht.

Weil die GUI waehrend der Ausfuehrung der Arbeitsschritte nicht mehr aktualisiert wird und damit haengt ist es notwendig einen Arbeitsschritt so gut es geht in kleine Arbeitsschritte aufzuteilen und zwischen diesen kleinen Arbeitsschritten immer wieder '$mw->update' aufrufen oder man startet die kleinen Arbeitsschritte mit 'repeat' bzw. 'after'.

Eine Alternative dazu ist die Verwendung von POE, dieses Framework ist aber relativ komplex, zumindest nicht in einen einzigen Post zu erklaeren.

Dokumentationen zu POE findest du hier
http://search.cpan.org/search?query=POE+Tk&mode=module

Datum: 13.06.2007-20:46

Beitragre: Progressbar
Seitenanfang
ich bin total kaput und habe es immer noch nicht gekriegt.ich finde es kompliziert dieses mal. aber ich gebe nicht leicht auf.
hier ist mein code jetzt, du kannst mir vielleicht sagen wie soll ich das am besten lösen

use strict;
use Tk;

use Tk::ProgressBar;

my @colors = ( 0, '#ff002a', 1, '#ff0014', 2, '#ff000a', 3, '#ff0500', 4, '#ff1000',
5, '#ff1b00', 6, '#ff3000', 7, '#ff3b00', 8, '#ff4600', 9, '#ff5100', );
my $anzahl_schritte = 10; # 10 Schritte
my $mw = MainWindow->new;
my $f_plat = $mw->Frame(-relief => 'sunken', -borderwidth => '10'); # Frame
my $install = $f_plat->Button(-text => "quit",-relief => 'raised',
-width => 9,-borderwidth => '10',
-command => sub{exit})->pack(-side => 'top',-padx => '0.5c');

my $pb = $f_plat->ProgressBar(-relief => 'raised',-width => 9,
-troughcolor=>'#BFEFFF',-length=>106,-colors=>\@colors,-from => 0,
-to => 100)->pack( -padx=>5, -pady=>5 );
$f_plat->pack;
&schritte_verarbeiten;
Tk::MainLoop();
sub schritte_verarbeiten{
for(1 .. $anzahl_schritte){
&naechster_schritt($_);
&delete_files();
$pb->value($pb->value + 10);
}
}
sub naechster_schritt{
for(1 .. int(rand 5)){
print '.';
sleep 1/4;
$mw->update;
$mw->iconify();
$mw->deiconify();
}
print "\n";
print "Schritt $_[0]\tabgeschlossen\n"; # $arr[$x][1]
}
sub delete_files(){
my ($deleted, $file, $removed);
$file ="C:\\zzzz"; # file to delete
if(-e $file){ # if the coresponding file exist => delete it
for(1 .. int(rand 10)){
$removed = rmtree($file) or warn "not deleted";
print "$removed file(s) is(are) removed\n";
}
}
else{ # if the file does not exist write the information in logfile
print "C:\\zzzz does not exist\n";
}
}

Gruß

Datum: 14.06.2007-19:54

Beitragre: Progressbar
Seitenanfang
ich danke dir für deine Hilfe.
so hat es funktioniert:
das ist ein kleines beispiel:

use strict;
use Tk;
use File::Path;
use Tk::ProgressBar;

my @colors = ( 0, '#ff002a', 1, '#ff0014', 2, '#ff000a', 3, '#ff0500', 4, '#ff1000',
5, '#ff1b00', 6, '#ff3000', 7, '#ff3b00', 8, '#ff4600', 9, '#ff5100', );
my $anzahl_schritte = 10; # 10 Schritte ### noch nicht
my $mw = MainWindow->new;
my $f_plat = $mw->Frame(-relief => 'sunken', -borderwidth => '10'); # Frame
my $install = $f_plat->Button(-text => "quit",-relief => 'raised',
-width => 9,-borderwidth => '10',
-command => sub{exit})->pack(-side => 'top',-padx => '0.5c');

my $pb = $f_plat->ProgressBar(-relief => 'raised',-width => 9,
-troughcolor=>'#BFEFFF',-length=>106,-colors=>\@colors,-from => 0,
-to => 100)->pack( -padx=>5, -pady=>5 );
$f_plat->pack;

&schritte_verarbeiten();
Tk::MainLoop();
sub schritte_verarbeiten
{
$mw->deiconify();
for(1 .. $anzahl_schritte)
{
&naechster_schritt($_); # next_step
&delete_files();
$pb->value($pb->value + 10);
}
}
sub naechster_schritt{
for(1 .. int(rand 5))
{
print '.';
sleep 1;
$pb->update();
}
print "\n";
print "Schritt $_[0]\tabgeschlossen\n"; # $arr[$x][1]
}
sub delete_files()
{
my ($deleted, $file, $removed);
$file ="C:\zzzz"; # file to delete
if(-e $file)
{ # if the coresponding file exist => delete it
$removed = rmtree($file) or warn "not deleted";
print "$removed file(s) is(are) removed\n";
}
else
{ # if the file does not exist write the information in logfile
print "C:\zzzz does not exist\n";
}
}

Gruß

Datum: 15.06.2007-13:47

Beitragre: Progressbar
Seitenanfang
aber ich hasse es wenn ich irgenwas verwende und nicht verstehe wie es läuft.
kannst du mir erklären was dieses bedeutet

int(rand 5) ???

Datum: 15.06.2007-14:09

Beitragre: Progressbar
Seitenanfang
Wie ich schon beschrieben habe musste ich bestimmte Dinge simulieren.
In diesen Beispiel habe ich den Zeitaufwand simuliert der das Loeschen der Dateien bedarf und damit dies nicht immer gleich lang ist habe ich die Dauer zufaellig bestimmt und das macht 'rand', es generiert eine Zufallszahl, 'int' machte daraus nur eine Ganzzahl und diesen Wert habe ich dann an 'sleep' uebergeben. So wird immer unterschiedlich lang "geschlafen", ein Verzeichnis mit wenigen Dateien ist auch schneller geloescht als eins mit vielen, dadurch arbeitet das Beispiel etwas realistischer.

Deinen Code sehe ich mir nachher noch einmal an...

Datum: 15.06.2007-15:26

Beitragre: Progressbar
Seitenanfang
ok jetzt habe ich verstanden.
kann man ein button in einem window irgendwie verschwinden lassenverschwinden lassen

Datum: 15.06.2007-16:16

Beitragre: Progressbar
Seitenanfang
Dafuer ist auch wieder der Geometriemanager verantwortlich, also entweder 'pack', 'grid', 'place'


$widget->packForget();

# oder

$widget->gridForget();

# oder

$widget->placeForget();
[code]

Wenn man den Button spaeter nicht mehr braucht geht auch ein
[code]
$widget->destroy();


damit wird der Button komplett geloescht und somit auch aus den Fenster entfernt.

Datum: 15.06.2007-16:31

Beitragre: Progressbar
Seitenanfang
danke dir funktioniert supa

Datum: 19.06.2007-09:30

-






-
-