Schrift
[thread]4918[/thread]

Tk und POE: Querulanten-POE in Tk einsetzen



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Froschpopo
 2005-04-06 16:11
#43344 #43344
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was ich als nächstes machen will ist folgendes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#! /usr/bin/perl -w


use Tk;
use POE qw(Session);

my $main = MainWindow->new(
    -title => "Ein kleiner test"
);

POE::Session->create( 'inline_states' =>
      { '_start' => \&test

      },
         'args' => [ "hi" ],
);

my $text = $main->Label(
    -text => "Jede Sekunde eine neue Zahl",
    -width => 10,
    -height=> 10
)->pack();

sub test {
    for (1..5) {
        sleep(1);
        $text->configure(-text => $_);
    }
}

POE::Kernel->run();

MainLoop;


Warum funzt das nicht ?

Code: (dl )
1
2
Can't call method "configure" on an undefined value at poetest.pl line 28.
POE::Kernel's run() method was never called.
\n\n

<!--EDIT|Froschpopo|1112789806-->
Taulmarill
 2005-04-06 16:32
#43345 #43345
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
VORSICHT! gui frameworks sind eventbasiert, genau so wie POE. wenn du POE mit Tk, Gtk+, Wx, etc... verwenden willst, brauchst du eine passenden event-loop. schau dir mal POE::Loop::Tk an.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Froschpopo
 2005-04-06 16:42
#43346 #43346
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ok, dann binde ich das $text->configure() außerhalb des kindes ein...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#! /usr/bin/perl -w


use Tk;
use POE qw(Session);

my $main = MainWindow->new(
    -background => 'white',
    -title => "Ein kleiner test"
);

my $text = $main->Label(
    -text => "Jede Sekunde eine neue Zahl",
    -width => 10,
    -height=> 10
)->pack();

POE::Session->create( 'inline_states' =>
      { '_start' => \&test

      },
         'args' => [ "hi" ],
);



sub test {
    for (1..5) {
        sleep(1);
        conf($_);

    }
}

POE::Kernel->run();

sub conf {
    $text->configure(-text => $_[0]);
}

MainLoop;

Allerdings kann ich mir jetzt das gesamte POE sparen, denn er führt das MainLoop auch erst aus wenn die schleife durchlaufen wurde anstatt einfach weiterzulaufen. D.h. er wartet 5 sekunden bis die Schleife durchlaufen ist und startet dann erst das Fenster. Da hätt ich ja gleich nen fork machen können.\n\n

<!--EDIT|Froschpopo|1112791377-->
Dubu
 2005-04-06 16:43
#43347 #43347
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Froschpopo,06.04.2005, 14:11]Warum funzt das nicht ?[/quote]
Weil das create() als letzten Schritt die in _start definierte Sub aufruft - und zu diesem Zeitpunkt ist $text noch nicht definiert.

Abgesehen davon macht auch es in der richtigen Reihenfolge nicht das, was du denkst: Das sleep(1) innerhalb von test() verhindert, dass irgendetwas von POE oder Tk waehrend der Schleife ausgefuehrt wird. Du erhaeltst also nur am Schluss, nach 5 Sekunden, ein Fenster, in dem "5" steht.
Froschpopo
 2005-04-06 16:51
#43348 #43348
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
das is ja irgendwie ein Logik-Fehler:
Wenn create als letzten Schritt _start aufruft, muss $text ja schon definiert sein, sonst wäre das ja nicht der letzte schritt.

habs zur übersicht etwas vereinfacht
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /usr/bin/perl -w


use Tk;
use POE qw(Session);

my $main = MainWindow->new(
-background => 'white',
-title => "Ein kleiner test"
);

POE::Session->create( 'inline_states' =>
{ '_start' => \&test

},
'args' => [ "hi" ],
);

sub test {
for (1..5) {
conf($_);
sleep(1);
}
}

POE::Kernel->run();

sub conf {
$main->configure(-title => $_[0]);
}
MainLoop;
\n\n

<!--EDIT|Froschpopo|1112791937-->
renee
 2005-04-06 16:54
#43349 #43349
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du scheinst die Antwort von Taulmarill nicht wirklich gelesen zu haben...

Vielleicht solltest Du Dich erstmal schlafen legen und dann in aller Ruhe Dich mal mit POE beschäftigen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2005-04-06 17:01
#43350 #43350
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
[quote=Taulmarill,06.04.2005, 14:32]VORSICHT! gui frameworks sind eventbasiert, genau so wie POE. wenn du POE mit Tk, Gtk+, Wx, etc... verwenden willst, brauchst du eine passenden event-loop. schau dir mal POE::Loop::Tk an.[/quote]
ich krieg das Modul nicht mit ppm installiert. Mein perl -MCPAN funktioniert auch nichtmehr, da kommt nur ne leere zeile und dann beendet sich das Prog. Aber ich will nicht rumjammern, lieber will ich wissen wozu ich jetzt wieder dieses Loop-Teil brauche
Dubu
 2005-04-06 17:03
#43351 #43351
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Froschpopo,06.04.2005, 14:51]das is ja irgendwie ein Logik-Fehler:
Wenn create als letzten Schritt _start aufruft, muss $text ja schon definiert sein, sonst wäre das ja nicht der letzte schritt.

habs zur übersicht etwas vereinfacht
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /usr/bin/perl -w


use Tk;
use POE qw(Session);

my $main = MainWindow->new(
    -background => 'white',
    -title => "Ein kleiner test"
);

POE::Session->create( 'inline_states' =>
      { '_start' => \&test

      },
         'args' => [ "hi" ],
);

sub test {
    for (1..5) {
        conf($_);
        sleep(1);
    }
}

POE::Kernel->run();

sub conf {
    $main->configure(-title => $_[0]);
}
MainLoop;
[/quote]
Und das funktioniert genau so, wie du es geschrieben hast:
Mit MainWindow->new() legst du ein MainWindow an (das damit ja noch nicht sichtbar ist).
POE::Session->create() legt eine POE::Session an, fuehrt dabei als letzten eigenen Schritt die Funktion in _start aus, also test().
Dieses test() aendert nun fuenfmal hintereinander den Titel des MainWindow (das immer noch nicht sichtbar ist) und legt jeweils das ganze Programm fuer eine Sekunde schlagen.
Wenn test() fertig ist, ist auch POE::Session->create() fertig, und das Programm laeuft weiter zum POE::Kernel->run(), fuer den es jetzt nichts weiter zu tun gibt, als eine Art Tk::MainLoop auszufuehren. Damit sieht man jetzt endlich das Fenster mit dem Titel "5".
Dubu
 2005-04-06 17:06
#43352 #43352
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Taulmarill,06.04.2005, 14:32]VORSICHT! gui frameworks sind eventbasiert, genau so wie POE. wenn du POE mit Tk, Gtk+, Wx, etc... verwenden willst, brauchst du eine passenden event-loop. schau dir mal POE::Loop::Tk an.[/quote]
Ich dachte, das mit der passenden Event-Loop macht POE schon automatisch, wenn es nach Tk etc. eingebunden wird!?

@froschpopo: POE::Loop::Tk ist kein eigenes Modul, sondern kommt mit POE. Einfach perldoc POE::Loop::Tk eingeben. (Wobei man das meiner Meinung nach gar nicht selber benutzen muss.)
Froschpopo
 2005-04-06 17:11
#43353 #43353
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
das ist aber doch kein Multithreading, wenn er nicht in der Lage ist mehrere sachen gleichzeitig zu machen, so wie bei fork. Ich wollte eigentlich den Text in dem Fenster in Echtzeit ändern..... dazu darf er sich aber nicht vom kind aufhalten lassen\n\n

<!--EDIT|Froschpopo|1112793281-->
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-04-06 16:11.