Schrift
[thread]5082[/thread]

Widgets manipulieren nach "MainLoop;" ?: mit oder ohne callbacks? (Seite 2)



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
[E|B]
 2005-09-20 19:05
#44583 #44583
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Eignet sich auf jeden Fall hervorragend fuer One-Liner:

Code: (dl )
perl -MTk -e "tkinit->Label(-text => 'Hallo')->pack and MainLoop"
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
renee
 2005-09-20 20:22
#44584 #44584
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Soweit ich weiß, machen tkinit und das MainWindow->new() das gleiche, aber das koennte ptk wohl besser beantworten!
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/
Crian
 2005-09-21 16:23
#44585 #44585
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=renee,19.09.2005, 17:46]Ohne Benutzerinteraktion kannst Du es nur Zeitgesteuert machen (Tk::after)...[/quote]

Du kannst auch selbstdefinierte Events auslösen und für diese Callbacks hinterlegen. Diese können etwa auf Änderungen im Dateisystem reagieren.

Schade, dass ich den zweiten Perl/Tk Vortrag in Frankfurt nicht mehr halten konnte :)\n\n

<!--EDIT|Crian|1127305492-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
BratHering
 2005-09-21 16:27
#44586 #44586
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,21.09.2005, 15:23][quote=renee,19.09.2005, 17:46]Ohne Benutzerinteraktion kannst Du es nur Zeitgesteuert machen (Tk::after)...[/quote]

Du kannst auch selbstdefinierte Events auslösen und für diese Callbacks hinterlegen. Diese können etwa auf Änderungen im Dateisystem reagieren.

Schade, dass ich den zweiten Perl/Tk Vortrag in Frankfurt nicht mehr halten konnte :)[/quote]
könntest du mir vielleicht ein kleines code beispiel dazu geben? oder mit welchem modul das gemacht wird?
Crian
 2005-09-21 16:54
#44587 #44587
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ein Beispiel ist das Erstellen eines eigenen Events bei einem selbstgeschriebenen Splashscreen:

Code: (dl )
$splash->bind('<<toete>>' => sub { $splash->destroy() } );


($splash fungiert hier als $mw)

Code: (dl )
1
2
3
4
5
6
7
$splash->after(
100,
sub {
&$f();
$splash->eventGenerate('<<toete>>', -when => 'now');
}
);


Hier wird zunächst die Initialisierungsfunktion laufen gelassen, dann setze ich Event ab.

Hier kommt ein Beispiel zu File-Events:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/perl
use strict;
use warnings;

use Tk;
use Tk::ROText;
use IO::File;
use POSIX qw/tmpnam/;
use File::Basename qw/dirname/;

use FindBin;

#
# create tempory file name:
#
my $File;
my $Handle;
my $Mw;
{
do {
$File = tmpnam();
}
until my $fh = new IO::File ($File, O_RDWR | O_CREAT | O_EXCL);
}
print "File: [$File]\n";



#
# create $File and open $Handle:
#
fill_in();
system('ls', '-l', dirname($File));
open($Handle, "tail -f $File|") or die "Nope: $!";

#
# Start Tk
#
tk_start();
exit;


sub tk_start {
my $mw = $Mw = new MainWindow;
#$mw->title("fileevent.pl - tmpfile: [$File]");

$mw->Label(
-text => "tmpfile: [$File]",
-anchor => 'w',
)->pack(
-fill => 'x',
-expand => 0,
);

$mw->Button(
-text => 'Daten in Datei schreiben',
-command => \&fill_in,
)->pack(
-fill => 'x',
-expand => 0,
-padx => 10,
-pady => 10,
-ipadx => 10,
);

my $t = $mw->Scrolled(
'ROText',
-scrollbars => 'oe',
-height => 10,
-width => 50,
)->pack(
-fill => 'both',
-expand => 1,
-pady => 10,
);

$mw->fileevent(\*$Handle, 'readable', [ \&fill_text_widget, $t ]);

MainLoop();

} # sub tk_start

sub fill_in {
system("date >> $File");
}

sub fill_text_widget {
my ($widget) = @_;

my $stat = sysread $Handle, $_, 4096;
die "sysread error: $!" unless defined $stat;

$widget->insert('end', $_);
$widget->yview('end');

} # sub fill_text_widget

END {
print "Anfang vom ENDE\n";
#$Mw->fileevent(\*$Handle, 'readable');
#$Handle->close();
unlink $File or die "Konnte '$File' nicht loeschen: $!";
print "Ende vom ENDE\n";
system "kill -9 $$";
} # END


Es wird ein File-Event erzeugt, das die Lesbarkeit des Dateihandels überprpüft. Dieses Dateihandel muss offen sein, Lesbarkeit bedeutet hier, dass noch Daten vorliegen, die eingelesen werden können.

Immer wenn wieder Daten aus dem Dateihandel gelesen werden können, wird die im File-Event hinterlegte Callback-Funktion aufgerufen.

Das Programm wartet auf Daten am Ende der übergebenen Datei, etwa einem Logfile.


Siehe perldoc Tk::fileevent und Mastering Perl/Tk Kapitel 15 und 19 auf den Seiten 378ff und 484ff.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2005-10-10 19:46
#44588 #44588
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich werfe hier noch die Methode afterIdle ins Spiel. Hiermit braucht man sich keinen Wert für die Zeit aus den Fingern saugen, sondern Tk feuert den Callback, sobald es bereit dazu ist.
ptk
 2005-10-10 19:47
#44589 #44589
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=renee,20.09.2005, 18:22]Soweit ich weiß, machen tkinit und das MainWindow->new() das gleiche, aber das koennte ptk wohl besser beantworten![/quote]
Ich habe noch nie einen semantischen Unterschied zwischen tkinit und new MainWindow gesehen.
Ishka
 2005-10-11 04:05
#44590 #44590
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Zum besseren Verständnis ist es praktisch zu wissen, daß der Befehl MainLoop so lange ausgeführt wird, bis das letzte Fenster zu ist (wobei er wie schon im Thread erwähnt via repeat, after oder callbacks andere Befehle ausführen kann).
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2005-10-12 03:40
#44591 #44591
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Ishka,11.10.2005, 02:05]Zum besseren Verständnis ist es praktisch zu wissen, daß der Befehl MainLoop so lange ausgeführt wird, bis das letzte Fenster zu ist (wobei er wie schon im Thread erwähnt via repeat, after oder callbacks andere Befehle ausführen kann).[/quote]
Es gibt seltene Fälle, wenn die MainLoop weiterläuft, obwohl das letzte Fenster schon geschlossen ist. Beispiel siehe unten: wenn das Fenster geschlossen wird, erscheint dennoch nicht "Fertig". Nur wenn die auskommentierte Zeile wieder aktiviert wird, dann wird beim Schließen des Fensters der waitVariable-Aufruf aufgehoben.
Code: (dl )
1
2
3
4
5
6
use Tk;
$top = new MainWindow;
# $top->OnDestroy(sub { $x = 1 });
$top->waitVariable(\$x);
MainLoop;
warn "Fertig";
renee
 2005-10-12 11:34
#44592 #44592
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Und damit kann man ganz schnell mal "auf die Schnauze" fliegen. Nach so einem Fehler habe ich mal zwei Tage lange gesucht *g*
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/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2005-09-19 15:59.