Schrift
[thread]5162[/thread]

Aktualisierung des Fensters alle 5 sec.: Main Windows automatisch aktualisieren

Leser: 2


<< >> 9 Einträge, 1 Seite
xiconfjs
 2006-03-02 22:49
#45272 #45272
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

ich hab mir mal die Foren-Threads durchgelesen, die von der "Automatischen Aktualiserung" handeln, aber irgendwie kann ich das nicht mit meinem Script vereinbaren. Das will einfach nicht. Erstmal das normale Script bzw. Vereinfachung:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;

my $los = 1;

while(1)
{
$var = hole_infos($los);
print $var;
$los++;
sleep(5);
}

sub hole_infos {
my $los = $_[0];
$los = $los+1;
return $los;
}


So, und die Ausgabe würde ich jetzt gern in einem "richtigen" Fenster (TK ^^) darstellen, aber so, dass es sich alle 5 Sekunden automatisch aktualiesiert. Bloß meine Versuche mit TK-Fenster und Mainloop gehen nicht so wie ich es will, denn entweder mit "while" wir das Fenster nicht aktualiesiert, und ohne while, wird die Funktion nicht wiederholt. Ich hab auch schon "repeat" versucht, aber das macht er irgendwie auch nicht, und wenn ich jedesmal das Fenster neu fülle, werden die ganzen Ausgaben der Funktion untereinander aufgereit. Und wenn ich versuche, das Fenster mit "delete" zu säubern und dann wieder zu füllen, gibt er immer Fehler, von wegen dass das Main-Fenster nicht gelöscht werden darf...(is ja irgendwie klar :P)

Ich hoffe ihr könnt meinem Gedächtnis auf die Sprünge helfen.


mFg xiconfjs
Froschpopo
 2006-03-02 22:52
#45273 #45273
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie updatest du denn? mit update oder configure?

ein problem ist bestimmt, dass dein script ab der while vermutlich hängenbleibt, richtig? Dann musst du die while durch ein repeat ersetzen, oder die while in einen fork oder thread auslagern.
Du kannst unter Tk eine while z.b. so umfunktionieren:

$mw->repeat($ping,...);
das wäre dann gleich zu setzen mit einer while.

ich hab jetzt den genauen syntax von repeat vergessen, aber das ginge dann in etwa so:

Code: (dl )
$mw->repeat(200, sub { &sub hole_infos(\$los)});

nun könntest du in der hole_infos() die referenz erhöhen und musst nur noch das mainWindow updaten.
Ich bin selbst nicht der spezi, aber irgendwie so könnte man es machen. Soll eher ein Denkanstoß sein als wie verwertbarer code\n\n

<!--EDIT|Froschpopo|1141333485-->
xiconfjs
 2006-03-03 00:30
#45274 #45274
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Froschpopo,02.03.2006, 21:52]nun könntest du in der hole_infos() die referenz erhöhen und musst nur noch das mainWindow updaten.[/quote]
Genau das ist mein Problem...:)
Froschpopo
 2006-03-03 00:33
#45275 #45275
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie hast du es denn versucht? machst du es mit configure oder update gemacht?

configure();

ein beispiel für ein Label:
Code: (dl )
$label->configure(-text => "neuer text");

$label muss natürlich ein unterelement von MW sein.\n\n

<!--EDIT|Froschpopo|1141339037-->
xiconfjs
 2006-03-03 01:11
#45276 #45276
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
Mit "Label"...

Code: (dl )
1
2
my $fenster = MainWindow->new();
my $text = $fenster->Label(-text => $zahl);
Froschpopo
 2006-03-03 01:14
#45277 #45277
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Dann könnte eine Tk-Schleifenanweisung so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
my $fenster = MainWindow->new();
my $text    = $fenster->Label(-text => $zahl);

$fenster->repeat(1000, sub {
  if (BEDINGUNG) {
     $text->configure(-text => $zahl++);
  }
});

probier mal!
Ich würde diese methode in Zusammenhang mit Tk generell einer while-Schleife vorziehen, da die while deine GUI einfriert solange sie Wahr ist.
repeat() übergibt das argument an ein event in den hintergrund welches dann damit arbeitet ohne die gui zu stören.\n\n

<!--EDIT|Froschpopo|1141341627-->
xiconfjs
 2006-03-03 01:53
#45278 #45278
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
abgesehen davon, dass das
Code: (dl )
$mw->pack();
noch gefehlt hat, hat die Grundstruktur funktioniert, so ich habs jetzt auch in eine hlist reingepackt, und jeweils kurz vor einer Aktualisierung alle Elemente der Liste gelöscht.
Code: (dl )
$hlist->delete('all');


THX nochmal und einen guten Schlaf noch :P\n\n

<!--EDIT|xiconfjs|1141343653-->
Froschpopo
 2006-03-03 03:21
#45279 #45279
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
warum löscht du denn die gesamte HList? Du kannst doch den einträgen immer jeweils eine nummer zuordnen... z.b. so:

$hlist{$nr} =...

dann hast du alle elemente der HList in einem Hash und kannst so einzelne bequemer modifzieren!
xiconfjs
 2006-03-03 11:03
#45280 #45280
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ist aber nicht notwendig, und würde die Sache nur umständlicher machen...ein Flush und fertig ist die Wurst...-_-
<< >> 9 Einträge, 1 Seite



View all threads created 2006-03-02 22:49.