Schrift
[thread]12611[/thread]

Perl TK widget löschen

Leser: 3


<< >> 8 Einträge, 1 Seite
Gast Gast
 2008-10-09 18:41
#115332 #115332
Hallo,
ich habe ein Toplevel Fenster, und ein child-Fenster. Im child-Fenster habe ich ein Label-Feld, dessen Inhalt ich löschen möchte. (Genauer gesagt, es werden die Ergenisse einer Suche in dieses Feld geschrieben. Bei erneuter Suche sollen die alten Ergebnisse verschwinden, und nur die neuen Ergebnisse dort stehen.)

Im Toplevel funktionierte das gut mit placeForget. Im child-Fenster aber nicht (da er nicht erkennt dass das Label im child-Fenster und nicht im Toplevel ist...).
Ich hatte es versucht mit:

$antwortfeld = $child -> placeForget;

Hat jemand eine Idee? Oder auch eine andere Lösung als mit Forget...

Danke!
pktm
 2008-10-09 23:29
#115354 #115354
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Wenn du nur den Inhalt des Labels löschen möchtest kannst du das über configure machen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/Perl/bin/perl

use strict;
use warnings;
use Tk;

my $mw = Tk::tkinit();

my $l = $mw->Label(-text => 'inhalt')->pack();

$mw->Button(-text => 'löschen', -command => sub{
$l->configure(-text => '');
})->pack();

$mw->Button(-text => 'random number einfügen', -command => sub{
$l->configure(-text => 'random number');
})->pack();

$mw->MainLoop();


In meinem Beispiel arbeite ich mit globalen Variablen, dass machst du als guter Programmierer natürlich nicht so ;-)
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2008-10-10 12:45
#115361 #115361
Das funktioniert leider auch nicht. Ich schätze gleiches Problem, dass Perl nicht weiß, dass ich das Antwortfeld (bei dir $1) im $child-Fenster mein.
Ich weiß nicht, ob ich das mit dem child-Fenster richtig geschrieben hab (habs nicht so mit Begrifflichkeiten...).

Im Code sieht das so aus:
my $child = $fenster->Toplevel(); (wobei $fenster ~= $mw)

Also über das existierende Fenster ($fenster = Toplevel) öffne ich ein neues Fenster, dass ich $child nenne. Neue Labels schreib ich dann beispielsweise:
my $antwortfeld = $child -> Label (-textvariable => \$ausgabe) -> place(-x => 250, -y => 180, -width => 350);
Und genau dieses Feld soll geleert werden.

Oder weiß jemand, wie ich das ganze Fenster löschen kann (also die Inhalte!), dann müsst ich kein neues child-Fenster generieren, sondern dass "neue" Fenster wäre dann auch Toplevel und das alte weg. Dann muss nachher das alte wieder neugeneriert werden, ist aber kein Problem, da keine Informationen wiederhergestellt werden. Wählte lediglich diese Lösung, da es das erste und einfachste war, was ich gefunden hab...
#Kein Kommentar
 2008-10-10 13:14
#115362 #115362
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
bei mir funktioniert das hier perfekt, aber ich weiß auch nicht ob es das ist was du haben willst:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use warnings;
use Tk;

my $mw = Tk::tkinit();

my $window_1 = $mw->Toplevel(-title => 'Fenster 1');
my $window_2 = $window_1->Toplevel(-title => 'Fenster 2');

my $label = $window_2->Label(-text => 'Vor der Suche')->pack();
$window_1->Button(-text => 'Suche', -command => sub{$label->configure(-text => 'Nach der Suche');})->pack();

$mw->MainLoop();
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
#Kein Kommentar
 2008-10-10 13:22
#115363 #115363
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
die placeForget()-methode funktioniert übrigens so:
Code: (dl )
$antwortfeld->placeForget();


und perl/tk weiß auch schon selber, was das elternelement von $antwortfeld ist
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
pktm
 2008-10-10 13:26
#115365 #115365
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gast+2008-10-10 10:45:13--
Das funktioniert leider auch nicht. Ich schätze gleiches Problem, dass Perl nicht weiß, dass ich das Antwortfeld (bei dir $1) im $child-Fenster mein.
Ich weiß nicht, ob ich das mit dem child-Fenster richtig geschrieben hab (habs nicht so mit Begrifflichkeiten...).


Na, also vorweg, das soll ein kleines L sein, und keine Eins (1).

Aber: Egal wann du ein Widget erstellst, wenn du es einer Variablen zuweist, hast du ein Symbol, mit dem du auf dieses Element zugreifen kannst.
Code: (dl )
1
2
3
my $toplevel = $mw->Toplevel(); # $toplevel enthält eine Referenz auf das Toplevel-Element

my $label = $toplevel->Label(); # $label enthält eine Referenz auf das Label im Toplevel.

Wenn du es genau so machst, solltest du eine Variable haben, auf die du zugreifen kannst.

Machst du es genau so?
Wenn nicht, kann dir ab dieser Stelle niemand weiter helfen (außer durch lustiges Raten), so lange du kein vollständiges Beispiel postest.

Ich habe dir ein solches bereit gestellt, dass getestet ist, und das eine Problemstellung darstellt. Mach das jetzt mal genauso.
Reduziere dein Problem in einer neuen Datei auf das absolute Minimum und poste das dann hier. Dann können wir dir weiter helfen.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Gast Gast
 2008-10-10 13:51
#115367 #115367
Super, danke!
Es funktioniert und zwar mit
$antwortfeld->placeForget();
Da dumm ich mich wohl etwas aus, dass es zwei einfache Klammern waren, die alles so kompliziert machten...

@pktm
Ich hab ja alles so probiert wie du es meintest. Dein Beispiel klappte gut. In meinem Code auch, zum Schluss auch mit meinem Label $antwortfenster. Aber nicht, wenn ich vorher die Suche betätigte, d.h. das Antwortfenster voll war. Dann dieses zu leeren (hatte eigenen Button dafür gemacht), oder etwas anderes reinzuschreiben klappte nicht mehr.
Wahrscheinlich hab ich auch irgendwo das eine oder andre Stückchen Code nicht ganz richtig geschriebn und deswegen moniert er. Aber gut, jetzt klappts ja.
(Dafür führt er ab dem zweiten Mal die Suche nicht mehr richtig aus. Aber das werd ich schon noch schaffen!)

Vielen dank für die nette Hilfe und die vielen Tips! :)
#Kein Kommentar
 2008-10-10 15:54
#115371 #115371
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
Gast+2008-10-10 11:51:55--
Super, danke!
Es funktioniert und zwar mit
$antwortfeld->placeForget();
Da dumm ich mich wohl etwas aus, dass es zwei einfache Klammern waren, die alles so kompliziert machten...


an den zwei fehlenden klammern hat es eigentlich nicht gelegen :)
es liegt daran das placeForget eine methode von einem label ist und nicht von einem toplevel. du musstest eben einfach nur placeForget auf $antwortfeld beziehen. (siehe auch ptkms post)
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
<< >> 8 Einträge, 1 Seite



View all threads created 2008-10-09 18:41.