kleines Problem mit eigenen TK Widgets

kleines Problem mit eigenen TK Widgets

am 08.01.2008 16:38:51 von struebig

Es ist wirklich interessant was man alles mit Tk entdecken kann. Ich hab
mir jetzt mal ein eigenes Widget konstruiert. Funktioniert auch einwandfrei.

Aber, das Element, dass ich in Popuplate meinem Frame hinzufüge
ignoriert an dieser Stelle die Argumente.
Im folgendem Beispiel zu sehen, das DirTree Objekt hat keinen weissen
Hintergrund. Zumindest hier mit ActivePerl auf Windows XP nicht.

Muss ich das Element woanders erzeugen und wann kann ich es konfigurieren?

Hier ein Beispiel Skript:

#!/usr/bin/perl -w
use strict;
package Dir;

use strict;
use Cwd;

use Tk::DirTree;
use base qw(Tk::Frame);
Construct Tk::Widget 'Dir';

sub Populate {
my ($self, $args) = @_;
$self->SUPER::Populate($args) ;
$self->pack();
my $el = $self->Scrolled('DirTree',
-scrollbars => 'se',
-width => 40,
-bg => '#ffffff',
)->pack(-expand => 1, -fill => 'both');

return $self;
}
package main;

use Tk;
my $top = new MainWindow;

my $x = $top->Dir();

MainLoop;

Struppi.

Re: kleines Problem mit eigenen TK Widgets

am 08.01.2008 20:29:33 von Lamprecht

J. Strübig schrieb:

> Aber, das Element, dass ich in Popuplate meinem Frame hinzufüge
> ignoriert an dieser Stelle die Argumente.
> Im folgendem Beispiel zu sehen, das DirTree Objekt hat keinen weissen
> Hintergrund. Zumindest hier mit ActivePerl auf Windows XP nicht.
>
> Muss ich das Element woanders erzeugen und wann kann ich es konfigurieren?

Frame zwingt seinen Kindern den -bg auf. Abhilfe wäre z.B.
$self->afterIdle([$el, 'configure', '-bg', 'white'])
(dann ist Frame fertig mit seinen Initialisierungen)
ungetestet...


Christoph

>
> Hier ein Beispiel Skript:
>
> #!/usr/bin/perl -w
> use strict;
> package Dir;
>
> use strict;
> use Cwd;
>
> use Tk::DirTree;
> use base qw(Tk::Frame);
> Construct Tk::Widget 'Dir';
>
> sub Populate {
> my ($self, $args) = @_;
> $self->SUPER::Populate($args) ;
> $self->pack();
> my $el = $self->Scrolled('DirTree',
> -scrollbars => 'se',
> -width => 40,
> -bg => '#ffffff',
> )->pack(-expand => 1, -fill => 'both');
>
> return $self;
> }
> package main;
>
> use Tk;
> my $top = new MainWindow;
>
> my $x = $top->Dir();
>
> MainLoop;
>
> Struppi.

Re: kleines Problem mit eigenen TK Widgets

am 09.01.2008 13:20:44 von struebig

Lamprecht schrieb:
> J. Strübig schrieb:
>
>> Aber, das Element, dass ich in Popuplate meinem Frame hinzufüge
>> ignoriert an dieser Stelle die Argumente.
>> Im folgendem Beispiel zu sehen, das DirTree Objekt hat keinen weissen
>> Hintergrund. Zumindest hier mit ActivePerl auf Windows XP nicht.
>>
>> Muss ich das Element woanders erzeugen und wann kann ich es
>> konfigurieren?
>
> Frame zwingt seinen Kindern den -bg auf. Abhilfe wäre z.B.
> $self->afterIdle([$el, 'configure', '-bg', 'white'])
> (dann ist Frame fertig mit seinen Initialisierungen)
> ungetestet...

und funktioniert.
Danke, ich hab gestern stundenlang nach so einem Event gesucht, aber
nicht gefunden.

Struppi.

Re: kleines Problem mit eigenen TK Widgets

am 09.01.2008 16:34:31 von Lamprecht

J. Strübig schrieb:

> Danke, ich hab gestern stundenlang nach so einem Event gesucht, aber
> nicht gefunden.
>
> Struppi.

Kenn ich ;)

Übrigens kannst du das Problem auch umschiffen, indem du ConfigSpecs für
-background aufrufst. Also z.B.

$self->ConfigSpecs(-bg => [$el,undef,undef,'white']);

(Aus Populate heraus)
So wie hier würde das bewirken, dass $composite->configure(-bg => 'foo')
an das subwidget $el delegiert wird. Genaueres in Tk::ConfigSpecs.

Christoph

Re: kleines Problem mit eigenen TK Widgets

am 10.01.2008 11:22:58 von struebig

Lamprecht schrieb:
> Frame zwingt seinen Kindern den -bg auf. Abhilfe wäre z.B.
> $self->afterIdle([$el, 'configure', '-bg', 'white'])
> (dann ist Frame fertig mit seinen Initialisierungen)
> ungetestet...

Das funktioniert leider nicht mehr, wenn ich mehrere ineinander
verschachtelte mega widgets habe.

Nachdem ich gestern stundenlang gesucht habe, bin ich auf diesen Thread
gestoßen:
http://aspn.activestate.com/ASPN/Mail/Message/perl-tk/185737 1

die Lösung liegt darin mit ConfigSpecs die Parameter an die Kinder zu
delegieren:

$self-> ConfigSpecs(
-background => [ [qw/DESCENDANTS /], qw/background background/, undef],
);


Trotzdem Danke, afterIdle konnte ich an anderer Stelle sinnvoll benutzen.

Struppi.

Re: kleines Problem mit eigenen TK Widgets

am 10.01.2008 11:25:57 von struebig

Lamprecht schrieb:
> J. Strübig schrieb:
>
>> Danke, ich hab gestern stundenlang nach so einem Event gesucht, aber
>> nicht gefunden.
>>
>> Struppi.
>
> Kenn ich ;)

Hätte ich nicht gedacht, ich finde oft (neben Slaven) deinen Namen
wenn's um Tk Probleme und Lösungen geht.


> Übrigens kannst du das Problem auch umschiffen, indem du ConfigSpecs für
> -background aufrufst. Also z.B.

Ja, hatte ich gestern auch noch entdeckt (die andere Nachricht habe ich
geschrieben als ich noch nicht die Nachrichten gelesen hatte).


Struppi.