Schrift
[thread]10814[/thread]

Wx-Anfänger: Elemente ineinandr verschachteln

Tags: Ähnliche Threads

Leser: 6


<< >> 8 Einträge, 1 Seite
pktm
 2007-11-17 17:09
#102507 #102507
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ich möchte ein Fenster mit einer Wx::StaticBox, in der wiederum Elemente (wie z.B. ein Button) stehen.
WIe mach eich das?

Hier ist mein Ansatz:

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
use strict;
use warnings;


package ServusWelt;
use Wx qw/
wxGROW wxALL wxVERTICAL
/;
use base qw(Wx::App); # von Wx::App ableiten


sub OnInit {
my $app = shift;
my $frame = Wx::Frame->new( undef, # kein Eltern-Fenster
-1, # Fenter id
'Servus Welt', # Titel
[-1, -1], # Position x/y
[150, 150] # Größe x/y
);
$app->SetTopWindow($frame); # Fenster als oberstes bestimmen

my $panel = Wx::Panel->new( $frame, -1);

my $staticbox = Wx::StaticBox->new( $panel, -1, 'Wx::StaticBoxSizer' );

my $nsz = Wx::StaticBoxSizer->new(
$staticbox,
wxVERTICAL
);

$nsz->Add( Wx::Button->new( $panel, -1, 'Button 3' ), 1, wxGROW|wxALL, 5 );

$frame->Show(1); # Fenster zeichnen
} # /OnInit


package main;


ServusWelt->new->MainLoop; # Programminstanz erzeugen und starten


Irgendwie wird das alles so übereinander angezeigt.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2007-11-17 17:50
#102509 #102509
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
in Wxperl kannst du Widgets absolute positionen geben, aber normal werden sizer verwendet wie ichs da (Wiki:WxPerlTutorialKapitel5) gezeigt hab
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pktm
 2007-11-17 18:18
#102511 #102511
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
lichtkind+2007-11-17 16:50:37--
in Wxperl kannst du Widgets absolute positionen geben, aber normal werden sizer verwendet wie ichs da (Wiki:WxPerlTutorialKapitel5) gezeigt hab



Ja, vor diesem Kapitel habe ich schon ziemlich oft gesessen. Es ist mir nicht eingängig. Ich gehöre wohl nicht zur Zielgruppe dieser Tutorial-Art, zumindest konnte ich dem Kapitel weder entnehmen, wie ich denn nun zwei Elemente nebeneinander anordne, noch wie die einzelnen Bestandteile funktionieren.

Besser ist so etwas in diversen Tk-Büchern beschrieben, in denen Schritt für Schritt mit möglichst wenigen Elementen (und nicht gleich dem Inventar eines ganzen Taschenrechners) die Funktionsweise der Anordnung von Elementen veranschaulicht wird (und das sogar noch mit Bildern!).

Also, was muss ich denn nun machen, wenn ich eine solche Wx::StaticBox mit einem Element (dem Button) auf meiner Oberfläche anzuordnen?

Meine Vorstellung ist zur Zeit:
- ich erstelle eine Oberfläche (Wx::Frame)
- das ist die, die zu sehen sein wird wenn das Programm startet ($app->SetTopWindow($frame);)

- da drauf erstelle ich dann eine Umgebung zur Anordnung meiner Elemente der grafischen Oberfläche (die einzelnen Bereiche, Buttons, Textfelder usw): my $panel = Wx::Panel->new( $frame, -1);

- dann erstelle ich mir diese Elemente, die ich anordnen möchte:
a) den Bereich mit dem Titel: my $staticbox = Wx::StaticBox->new( $panel, -1, 'Wx::StaticBox' );
b) den Button, den ich gerne in dieser Box drin hätte: my $button = Wx::Button->new( $panel, -1, 'Button 3' );

So hier jetzt: Wie mache ich das, dass der Button in der Wx::StaticBox ist?

- abschließend sage ich dem Programm dann noch, dass diese Wx::StaticBox auf der Oberfläche angezeigt werden soll: $nsz->Add( $staticbox, 1, wxGROW|wxALL, 5 );


Dass der Programmcode da voller Fehler ist zeigt mir das Resultat auf (immerhin wird irgendwas angezeigt...).

Die Frage ist jetzt, wie es richtig geht.

Hier das, was ich aktuell vor mir habe:
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
use strict;
use warnings;


package ServusWelt;
use Wx qw/
wxGROW wxALL wxVERTICAL
/;
use base qw(Wx::App); # von Wx::App ableiten


sub OnInit {
my $app = shift;
my $frame = Wx::Frame->new( undef, # kein Eltern-Fenster
-1, # Fenter id
'Servus Welt', # Titel
[-1, -1], # Position x/y
[150, 150] # Größe x/y
);
$app->SetTopWindow($frame); # Fenster als oberstes bestimmen

my $panel = Wx::Panel->new( $frame, -1);

my $nsz = Wx::BoxSizer->new(wxVERTICAL);

my $staticbox = Wx::StaticBox->new( $panel, -1, 'Wx::StaticBox' );
my $button = Wx::Button->new( $panel, -1, 'Button 3' );

$nsz->Add( $staticbox, 1, wxGROW|wxALL, 5 );

#$nsz->Add( $button, 1, wxGROW|wxALL, 5 );

$frame->Show(1); # Fenster zeichnen
} # /OnInit


package main;


ServusWelt->new->MainLoop; # Programminstanz erzeugen und starten


Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2007-11-17 19:00
#102515 #102515
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
naja ich hab meist das gefühl leute für blöd zu verkaufen wenn ich zu langsam vorgehe. aber ich kann das tutorial ja noch verbessern, das ist je eh noch halb fertig.

Aber erst mal 2 grunsätzliche hinweise:

1.)versuch die zeilen zu ordnen und nicht so lang werden zu lassen.
2.)benutz use Wx qw (:everything); solang du noch probierst.

im groben liegst du schon richtig, ich glaub für dich klärt sich alles wenn du die bedeutung von "wxGROW|wxALL" verstehst weil die an der stelle deines programmes keinen sinn machen. bei buttons fürd ich nie wxGROW benutzen sondern nur bei widgets die was sinnvolles mit dem mehr an platz anfangen können wie textfelder oder so. und das WxALL verhindert eigentlich das was du erreichen willst. Das macht das es sich an allen 4 rahmenkanten ausrichtet, also in der mitte, aber du willst es ja oben anhängen, also wäre deine Wahl eher wxTOP. Ähnlich unschön ist die 1 im zweiten parameter die dir ebenfalls den button aufbläst in dir dimension die der sizer nicht kontrolliert.

Code (perl): (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
use strict;
use warnings;

package ServusWelt;
use Wx qw/ :everything /;
use base qw(Wx::App);                       # von Wx::App ableiten

sub OnInit {
 my $app   = shift;
 my $frame = Wx::Frame->new( undef, -1, 'Servus Welt', [-1, -1], [150, 150]);
 my $panel = Wx::Panel->new( $frame, -1);
    
 my $staticbox = Wx::StaticBox->new( $panel, -1, 'Wx::StaticBox' );
 my $button    = Wx::Button->new( $panel, -1, 'Button 3' );
    
 my $nsz = Wx::StaticBoxSizer->new( $staticbox, wxVERTICAL);
    $panel->SetSizer($nsz);
    $nsz->Add( $button, 0, wxGROW|wxTOP, 5 );

    
    $frame->Show(1);                        # Fenster zeichnen
    $app->SetTopWindow($frame);             # Fenster als oberstes bestimmen
        1;
} # /OnInit

package main;
ServusWelt->new->MainLoop;                # Programminstanz erzeugen und starten

vielleicht verstehst du es aus dem code heraus wenn nicht frag einfach weiter :)
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pktm
 2007-11-17 19:15
#102516 #102516
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ah toll! Jetzt sieht das schon viel besser aus!
Jetzt habe ich allerdings den Button und die StaticBox nebeneinander. Ich möchte noch den Button in die StaticBox rein haben.
Wie mache ich das? Muss ich die $staticbox irgendwo als Parent angeben? Wie?
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2007-11-17 19:16
#102517 #102517
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
ich versteh dich leider nicht. im zuletzt gezeigten beispiel ist der button in der box. ist dein problem das die box am frame klebt und der rahmen nicht sichertbar ist?
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pktm
 2007-11-17 19:27
#102519 #102519
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ach, ich hatte diese Zeile hier noch anders: my $nsz = Wx::StaticBoxSizer->new( $staticbox, wxVERTICAL);

Wie liest man diese Zeile? Warum muss ich $staticbox übergeben?
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2007-11-17 19:41
#102522 #102522
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
damit sagst du welche staticbox den sizer umrahmt. der sizer selber ist ja mit setSizer an das panel geknüpft. es gibt noch eine kürzere schreibweise, wo du staticbox gar nicht definieren brauchst, aber die scheint noch nicht in wxperl gewrapped zu sein. (siehe http://www.wxwidgets.org/manuals/stable/wx_wxstati...)
besorg dir unbedingt die doku unter http://www.wxwidgets.org/docs/
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-11-17 17:09.