Schrift
[thread]5266[/thread]

Rahmen in Tk: Frage zu Rahmen in Tk

Leser: 3


<< >> 10 Einträge, 1 Seite
Gast Gast
 2006-12-03 11:11
#46007 #46007
Hallo,
ich befasse mich zur Zeit intensiv mit Perl/Tk und habe dazu einige Fragen:
1. Ist es möglich, um ein Frame herum einen farbigen Rahmen zu machen?
2. Ich habe ein Frame gemacht mit 250x170 Pixel mit schwarzem Hintergrund. Ich möchte da gerne was hineinschreiben, aber wenn ich dann ein Label als "Kind-"Element (afaik nennt man das so) des Frames benutze, ist der Frame nicht mehr da, nur noch das Label. Kann mir also jemand sagen, wie ich in folgenden Frame was reinschreiben kann?
my $videofenster = $top -> Frame (-height => '170p', -width => '250p', -background => 'black');
$videofenster -> place(-x=>'7p', -y => '7p');

So, das waren vorerst mal alle meine Fragen.

Gruß

DHK
ptk
 2006-12-03 13:03
#46008 #46008
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Guest,03.12.2006, 10:11]Hallo,
ich befasse mich zur Zeit intensiv mit Perl/Tk und habe dazu einige Fragen:
1. Ist es möglich, um ein Frame herum einen farbigen Rahmen zu machen?
[/quote]Nicht direkt. Es gibt zwar die Option -borderwidth, aber der erzeugte Rahmen hat immer eine Defaultfarbe, die entweder schwarz ist oder einen 3D-Effekt erzeugt und dabei die Hintergrundfarbe des Frames verwendet. Einfach mal mit -borderwidth und -relief spielen.

Als Workaround kann man ein Frame in einem anderen Frame schachteln und dabei verschiedene Hintergrundfarben verwenden. Siehe Skript unten.
Quote
2. Ich habe ein Frame gemacht mit 250x170 Pixel mit schwarzem Hintergrund. Ich möchte da gerne was hineinschreiben, aber wenn ich dann ein Label als "Kind-"Element (afaik nennt man das so) des Frames benutze, ist der Frame nicht mehr da, nur noch das Label. Kann mir also jemand sagen, wie ich in folgenden Frame was reinschreiben kann?
Code: (dl )
1
2
my $videofenster = $top -> Frame (-height => '170p', -width => '250p', -background => 'black');
$videofenster -> place(-x=>'7p', -y => '7p');
Ich nehme an, da hat die "geometry propagation" zugeschlagen. Die Größe eines Containerwidgets hängt nämlich von der Größe der enthaltenen Kinderwidgets ab. Typischerweise ist genau das, was man haben möchte; man muss sich somit nicht darum kümmern, wie groß das Containerwidget sein muss. Wenn man aber die Größe des Containerwidgets doch angeben möchte, muss man die "geometry propagation" ausschalten. Wenn man beispielsweise "pack" verwendet, macht man das mit $top->packPropagate(0). Siehe Beispiel unten.

Code: (dl )
1
2
3
4
5
6
7
use Tk;
$mw=tkinit;
$mw->packPropagate(0);
$fouter = $mw->Frame(-borderwidth => 10, -bg => "green")->pack(-fill => "both", -expand => 1);
$f=$fouter->Frame(-bg => "red")->pack(-fill => "both", -expand => 1);
$f->Label(-text => "hallo", -bg => "red")->place(-relx => 0.5, -rely => 0.5, -anchor => "c");
MainLoop;
PerlProfi
 2006-12-03 13:08
#46009 #46009
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Für den farbigen Rahmen muss man allerdings nicht 2 Frames benutzen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

my $mw = tkinit;

$mw->Frame(-highlightbackground => "red",
-highlightthickness => 5,
-background => "black")->pack(qw/-fill both -expand 1/);

$mw->geometry("200x200");

MainLoop;


MfG PerlProfi
ptk
 2006-12-03 13:22
#46010 #46010
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
-highlighthickness ist für die Fokusmarkierung gedacht. Wenn ein anderes Widget den Fokus bekommt, dann verschwindet dieser Rahmen wieder. Einfach das folgende erweiterte Skript aufrufen und auf Tab drücken.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

my $mw = tkinit;

my $f=$mw->Frame(-highlightbackground => "red",
-highlightthickness => 5,
-background => "black")->pack(qw/-fill both -expand 1/);
$f->Entry->pack;
$mw->geometry("200x200");

MainLoop;
PerlProfi
 2006-12-03 13:54
#46011 #46011
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Oh!
Also muss man immer mit einem Hilfsframe einen farbigen Rahmen erstellen?
Und der ist dann nicht mal 3D!?\n\n

<!--EDIT|PerlProfi|1165147000-->
renee
 2006-12-03 14:49
#46012 #46012
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
... oder Du musst ein Patch für Tk schreiben... :p
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/
ptk
 2006-12-03 17:32
#46013 #46013
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn man es tatsächlich häufiger brauchen würde, könnte man ein Megawidget schreiben. Und mit verschachtelten Frames kann man auch einen 3D-Effekt erzeugen:
Code: (dl )
1
2
3
4
5
6
use Tk;
$top = new MainWindow;
$top->packPropagate(0);
$f_outer = $top->Frame(-borderwidth => 10, -relief => "raised", -bg => "blue")->pack(qw(-fill both -expand 1));
$f_outer->Frame->pack(qw(-fill both -expand 1));
MainLoop;
\n\n

<!--EDIT|ptk|1165159967-->
PerlProfi
 2006-12-03 19:14
#46014 #46014
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Was ist ein Megawidget?
Ich habe mir gerade mal tk3d.h angesehen, eigentlich sollte es doch nicht so schwer sein, zu implementieren, dass die Rahmen Farbe vom Benutzer bestimmt wird, oder?

Original aus tk3d.h
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
    XColor *bgColorPtr;        /* Background color (intensity

* between lightColorPtr and

* darkColorPtr). */
XColor *darkColorPtr; /* Color for darker areas (must free when

* deleting structure). NULL means shadows

* haven't been allocated yet.*/
XColor *lightColorPtr; /* Color used for lighter areas of border

* (must free this when deleting structure).

* NULL means shadows haven't been allocated

* yet. */
Pixmap shadow; /* Stipple pattern to use for drawing

* shadows areas. Used for displays with

* <= 64 colors or where colormap has filled

* up. */
GC bgGC; /* Used (if necessary) to draw areas in

* the background color. */
GC darkGC; /* Used to draw darker parts of the

* border. None means the shadow colors

* haven't been allocated yet.*/
GC lightGC; /* Used to draw lighter parts of

* the border. None means the shadow colors

* haven't been allocated yet. */


MfG PerlProfi
ptk
 2006-12-03 19:49
#46015 #46015
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=PerlProfi,03.12.2006, 18:14]Was ist ein Megawidget?[/quote]Ein zusammengebautes oder abgeleitetes Widget. Siehe perldoc Tk::mega
Quote
Ich habe mir gerade mal tk3d.h angesehen, eigentlich sollte es doch nicht so schwer sein, zu implementieren, dass die Rahmen Farbe vom Benutzer bestimmt wird, oder?
Nicht schwer ist relativ. Das ist nicht die einzige Stelle, man muss wohl auch tkUnix3d.h, tkWin3d.h etc. ändern, sowie -bordercolor-Optionen in den Widget-Implementationen einführen (tkFrame.c, tkButton.c etc.). Aber vielleicht sollten wir mal abwarten, was die neue "themed tk"-Erweiterung bringen wird?

Übrigens ist es doch mit -highlightthickness möglich, die Rahmenfarbe zu ändern. Man muss auch noch -highlightcolor setzen. Hier der geänderte Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

my $mw = tkinit;

$mw->Frame(-highlightbackground => "red",
-highlightcolor => "red",
-highlightthickness => 5,
-background => "black")->pack(qw/-fill both -expand 1/);
$mw->Entry->pack;
$mw->geometry("200x200");

MainLoop;
PerlProfi
 2006-12-03 20:03
#46016 #46016
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Zum Glück geths auch ohne Patch ;)
Schade nur das man nicht auch noch -highlightrelief, oder etwas in der Art setzen kann.

MfG PerlProfi
<< >> 10 Einträge, 1 Seite



View all threads created 2006-12-03 11:11.