Schrift
[thread]5359[/thread]

listbox refresh mit Tk::After

Leser: 2


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
hudo
 2007-07-27 23:04
#46638 #46638
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hallo ich moechte den Inhalt einer Datei mit TK in einer Listbox ausgeben, dabei soll der Inhalt der Datei (selbsttaetig) nach n Sekunden aktualisiert werden. Bin dabei auf Tk::After gestoßen, komme aber nicht mit der Syntax klar.
Kann mir dabei jemand behilflich sein.
Vielleicht weiss auch jemand eine andere Moeglichkeit ?

Anbei ein Auszug aus dem Code
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/perl

use Tk;
use Tie::File;
use Tk::after;


my $liste;
my $liste_font;
my $breite=100; ### Anzahl der abgezeigten Zeichen in der Liste
my $the_selectmode = "extended"; ### "single","multiple","extended"
my $enter;
my @array_file;



my $mw = MainWindow->new();

### rahmen fuer Hauptseite
my $frame1 = $mw->Frame(-width=>50, -height=>50, -bg=>"seashell");
my $frame2 = $mw->Frame(-width=>5, -height=>5, -bg=>"grey80");

$liste_font = $mw->fontCreate(-family=>"courier", -size=>7 ); ### zB treffer-Liste

my $liste = $frame1->ScrlListbox(

##-font=>$liste_font,
-setgrid=>1,
-scrollbars=>"se",

#-background=>"wheat3",

-background=>"lemonchiffon3",

-borderwidth=>3,

-highlightthickness=>10,

##-selectmode => "extended", ###"multiple"

##-selectmode => "multiple",

##-selectmode => "single",
## -selectmode =>$the_selectmode,

-height => 30,
## -width => $breite,

-selectforeground=>"blue",

-selectbackground=>"green",

##-setgrid=>1,

##-selectborderwidth=>1,

-relief=>"ridge",

-exportselection => 1)->pack(-side=>"right", -expand=>1, -fill=>"both");

my $exitButton = $frame2->Button ( -text=>"Schliessen" ,-command=>"exit" ,-bg=>"red" ,-activebackground=>"red" ,-activeforeground=>"cyan" )->pack(-anchor=>"w" ,-padx=>10 ,-pady=>15 ,-ipady=>10 ,-fill=>"x");



##################################################################
### Packen der Rahmen auf Hauptseite ############################
##################################################################


$frame1->pack(-side => 'left' ,-expand=>1 ,-fill=>"both");
$frame2->pack(-side => 'right',-expand=>1 );

$frame2->pack(-expand=>1 ,-fill=>"both");


##############################################
### sofort ausgefuehrte Subroutines
##############################################
=pod
while(1) {

#&fill_from_file();


sleep(2);
};
=cut


#&fill_from_file();
&fill_with_tie();

##############################################
### Ende sofort ausgefuehrte Subroutines
##############################################



MainLoop;

######################################################
sub fill_from_file {

my $file = "meinfile.txt";
my $line;

$liste->delete(0,"end");

if ( -s $file ) {
open(DATEI, "<$file") or die $!;

while ($line = <DATEI>) {
chomp $line;
$liste->insert(0,$line);
}
close(DATEI);
} ## if -s $file

} ## fill_from_file #################
############################################################



######################################################
sub fill_with_tie {

my $file = "meinfile.txt";
my $line;
my $elem;

$liste->delete(0,"end");

if ( -e $file ) {
tie @array_file, "Tie::File", $file || die $!;

foreach $elem (@array_file) {

chomp $elem;
$liste->insert(0,$elem);

} ## foreach

untie @array_file;


} else {
print "Kann $file nicht oeffnen $!\n";
} ## if -s $file

} ## fill_with_tie #################
############################################################
ptk
 2007-07-28 01:46
#46639 #46639
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
"use Tk::after" braucht man nicht.

Einfach nur $mw->after($milliseconds, sub { ... }) verwenden
hudo
 2007-07-28 11:05
#46640 #46640
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hallo,

wo schreibt man die Zeile hin ? Ich hab es vor MainLoop geschrieben:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
&fill_from_file();
#&fill_with_tie();

##############################################
### Ende sofort ausgefuehrte Subroutines
##############################################

## Zeitsteuerung
$mw->after(1000, \&fill_from_file() );

MainLoop;


bringt aber folgende Fehlermeldung:

Quote
error:Undefined subroutine &main::1 called at d:/winxp/perl/lib/Tk/After.pm lin
e 89.

Tk::Error: Undefined subroutine &main::1 called at d:/winxp/perl/lib/Tk/After.pm
line 89.
Tk::After::once at d:/winxp/perl/lib/Tk/After.pm line 89
[once,[{},after#8,1000,once,\1]]
("after" script)


Ich habe es mit
use Tk::after und ohne probiert, war immer dasselbe

Ich verwende gerade activestate perl 5.8.8 auf windows xp
renee
 2007-07-28 12:00
#46641 #46641
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Lass mal die Klammern nach "fill_from_file" weg...
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/
hudo
 2007-07-28 19:10
#46642 #46642
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hallo renee,

danke fuer den Tip mit der Klammer. Die Fehlermeldung ist wirklich weg.
Allerdings wird die Liste NICHT aktualisiert wenn ich das file in einem Editor bearbeite und abspeichere.

Das bedeutet mein Problem ist noch nicht geloest.
Weiss jemand Rat ?
ptk
 2007-07-28 20:05
#46643 #46643
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
->after wird nur einmal ausgeführt. Möchtest du es periodisch, musst du ->repeat verwenden (gleiche Syntax wie aftere).
hudo
 2007-07-28 20:38
#46644 #46644
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Cool, danke ptk und renee, jetzt funktionierts wie ich mir das vorstelle.
Nun habe ich noch eine Frage (sollte vielleicht ein neues topic aufmachen):

Ich möchte einen UDP-Server bauen, der die ganze Zeit hört (und den Clients antwortet. Das ist eine Endlos-Schleife mit zB while (1)

Und die empfangenen Nachrichten möchte ich in einem file speichern und grafisch in einer listbox (aktualisiert nach n Sekunden) ausgeben.

Die Frage lautet, kann man die zwei Endlos-Schleifen (einmal vom Server, einmal MainLoop) unter einen Hut bringen ?

Ich bitte um Vorschläge (auch ob ich dazu einen neuen Thread aufmachen sollte.
ptk
 2007-07-28 22:14
#46645 #46645
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Such mal nach dem Stichwort "fileevent", entweder hier oder in der Perl/Tk-Doku.

Vielleicht kann dir auch das Modul CPAN:POE helfen.
hudo
 2007-08-10 13:53
#97881 #97881
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
Hallo ptk,
hab das mit fileevent ausprobiert, funktioniert aber nicht
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
#!/usr/bin/perl

use Tk;
use Tie::File;
use Tk::after;


my $liste;
my $liste_font;
my $breite=100; ### Anzahl der abgezeigten Zeichen in der Liste
my $the_selectmode = "extended"; ### "single","multiple","extended"
my $enter;
my @array_file;
my $filename="meinfile.txt";

open (FH, "<$filename" ) || die "Kann $filename nicht oeffnen $! \n";

my $mw = MainWindow->new();

### rahmen fuer Hauptseite
my $frame1 = $mw->Frame(-width=>50, -height=>50, -bg=>"seashell");
my $frame2 = $mw->Frame(-width=>5, -height=>5, -bg=>"grey80");

$liste_font = $mw->fontCreate(-family=>"courier", -size=>7 ); ### zB treffer-Liste

my $liste = $frame1->ScrlListbox(

##-font=>$liste_font,
-setgrid=>1,
-scrollbars=>"se",
-background=>"lemonchiffon3",
-borderwidth=>3,
-highlightthickness=>10,
-height => 30,
-selectforeground=>"blue",
-selectbackground=>"green",
-relief=>"ridge",
-exportselection => 1)->pack(-side=>"right", -expand=>1, -fill=>"both");

my $exitButton = $frame2->Button ( -text=>"Schliessen" ,-command=>"exit" ,-bg=>"red" ,-activebackground=>"red" ,-activeforeground=>"cyan" )->pack(-anchor=>"w" ,-padx=>10 ,-pady=>15 ,-ipady=>10 ,-fill=>"x");



##############################
### Packen der Rahmen auf Hauptseite ############################

$frame1->pack(-side => 'left' ,-expand=>1 ,-fill=>"both");
$frame2->pack(-side => 'right',-expand=>1 );
$frame2->pack(-expand=>1 ,-fill=>"both");


$mw->fileevent(FH, 'readable', [\&refresh_list] );
#$mw->fileevent(FH, readable=>\&refresh_list );

$mw->MainLoop;


#########
sub refresh_list {
my $line;

$liste->delete(0,"end");

if ( $line = <FH> ) {
chomp $line;
$liste->insert(0,$line);
} else {
$mw->fileevent (FH, 'readable', "");
} ## if

} ## refresh_list
############
ptk
 2007-08-10 22:12
#97926 #97926
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Was meinst du mit "funktioniert nicht"? Du löscht bei jedem Fileevent die Listbox, ist das gewollt? Möchtest du einen Art "tail -f" implementieren? Dazu gibt es ein Beispielskript in der Perl/Tk-Distirbution (tktail), allerdings ohne fileevent gelöst.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-07-27 23:04.