Schrift
[thread]10766[/thread]

menubar widgets ausblenden und bind



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Krikus
 2007-11-10 00:46
#102161 #102161
User since
2007-11-10
13 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe folgendes Problem.

Sobald ich einen Menüpunkt aufrufe, z.B Gruppe löschen und dann anschließend Benutzer löschen dann bleiden die Eingabefelder von vorher stehen.
Wie kann ich diese ausblenden bzw. löschen.
Desweitern würde ich gerne über die Tasten die 4 Menüpuntte ansteuern.
Allerdings weiß ich nicht was ich in die sub eintragen muss. (siehe unten)

Hier der Code damit es verständlicher wird.

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
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
#!/usr/bin/perl -w


use strict;
use warnings;
use diagnostics;

use Tk;
use Tk::BrowseEntry; 



my $main = new MainWindow;

$main->title('Unser AD/TK Projekt');
#$main->configure (-width=>"640",-height=>"480"); #Geht bei pack nicht
my $toplevel = $main->toplevel; #Erzeugung Menü


# Die Menueleiste wird in den Kopf des Fensters gehaengt
my $menubar = $toplevel->Menu(-type => 'menubar');
$toplevel->configure(-menu => $menubar);

# Nun bauen wir ein Datei-Menue
my $mdatei = $menubar->cascade(-label => 'Datei', -underline => 0, -tearoff => 0);
$mdatei->command(-label => 'Öffnen', -command => sub{datei_oeffnen()});
$mdatei->command(-label => 'Beenden', -command => sub{ exit });

# Nun bauen wir ein Benutzer-Menue
my $mbenutzer = $menubar->cascade(-label => 'Benutzer',-underline => 0,-tearoff => 0);
$mbenutzer->command(-label => 'Benutzer löschen', -command => sub{benutzer_loeschen()});
$mbenutzer->command(-label => 'Benutzer verschieben', -command => sub{ exit});

# Nun bauen wir ein Gruppen-Menue
my $mgruppe = $menubar->cascade(-label => 'Gruppen',-underline => 0,-tearoff => 0);
$mgruppe->command(-label => 'Gruppe erzeugen', -command => sub{exit});
$mgruppe->command(-label => 'Benutzer in Gruppe anzeigen lassen', -command => sub{ exit });
$mgruppe->command(-label => 'Benutzer in Gruppe hinzufügen', -command => sub{ exit });
$mgruppe->command(-label => 'Gruppe löschen', -command => sub{ gruppe_loeschen() });

# Nun bauen wir ein Hilfe-Menue
my $mhilfe = $menubar->cascade(-label => 'Hilfe',-underline => 0,-tearoff => 0);
$mhilfe->command(-label => 'Kontakt', -command => sub{hilfe_konakt()});
$mhilfe->command(-label => 'Info', -command => sub{ hilfe_info() });

my $framelist = $main->Frame;

$framelist->pack(-side,'top');

my $label = $main->Label(-text => 'Unser AD/TK Projekt', -width=>"50") ->pack(-in=>$framelist, -side => 'top');



# Menü aufrufbar machen mit Alt und dem unterstrichenen Buchstaben:
$main->bind('<Alt-d>',     sub {});
$main->bind('<Alt-b>',     sub {});
$main->bind('<Alt-g>',     sub {});
$main->bind('<Alt-h>',     sub {});



MainLoop;

sub datei_oeffnen
{
my $dir = $main->getOpenFile();
#print $dir; #Ausgabe in der Konsole
}

sub gruppe_loeschen

{
my $dropdown1 = $main->BrowseEntry(-width=>"50")->pack(-side,'top');

#Inhalt Dropdown1
$dropdown1->insert(0,'eins','zwei','drei','vier','fünf');

my $button1 = $main->Button(-text => 'Gruppe löschen', -command => \&gruppenloeschen

)->pack(-side,'bottom');

  #$main->messageBox (-message=>"Programm wird beendet");

  #exit;

}

sub benutzer_loeschen

{
my $dropdown2 = $main->BrowseEntry(-width=>"50")->pack( -side,'top');
#Inhalt Dropdown2
$dropdown2->insert(0,'eins','zwei','drei','vier','fünf');

my $button2 = $main->Button(-text => 'Benutzer löschen',-command => \&benutzerloeschen

 )->pack(-side,'bottom');


}

sub hilfe_konakt
{
$main->messageBox (-title => 'Kontakt', -message=>'Support erhalten sie unter xxx@xxx.de');
}
sub hilfe_info
{
$main->messageBox (-title => 'Info', -message=>'Programm Version v0.1');
}
Spieler
 2007-11-10 10:15
#102163 #102163
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,

Zeile 16 könnte vielleicht so heissen?
Code: (dl )
  $main-> minsize(qw(640 480));

Die -underline Option für die Menueinträge erstellt schon die Bindings für dich, du darfst sie nur nicht überschreiben ( Z.55 ff).
Zu der ersten Frage: Poste doch einmal deine sub &gruppenloeschen. Die hast du noch gar nicht definiert.

Grüße, Christoph
Krikus
 2007-11-10 11:45
#102167 #102167
User since
2007-11-10
13 Artikel
BenutzerIn
[default_avatar]
Moin,
Also kann ich Zeile 55-58 weglassen.
Kann aber trotzdem nicht mit ALT+D z.B das Menü Datei aufrufen.

Die sub &gruppeloeschen war meine Fehler. Soll so etwa ausehen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub gruppe_loeschen

{
my $dropdown1 = $main->BrowseEntry()->pack(-side,'top');

#Inhalt Dropdown1
$dropdown1->insert(0,'eins','zwei','drei','vier','fünf');

my $button1 = $main->Button(-text => 'Gruppe löschen', -command => 
sub
{
print "hallo";
}


)->pack(-side,'bottom');

}


Tut aber alles nichts zu meinen ersten Problem.
Wenn ich im Menü Benutzer löschen wähle, habe ich eine Dropdown+Buton.
Wechsel ich in das Menü Gruppen löschen, dann ist das vorherige Dopdown +Button vom Benutzer löschen immernoch da und ich habe 2 Dropdowns + Buttons.
Dies soll nicht so sein.
Spieler
 2007-11-10 12:33
#102168 #102168
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,

du erzeugst auch jedesmal neue Widgets.
Willst du denn diese BrowseEntry und Button wirklich im MW haben? Vielleicht wäre ein Dialog oder ein eigenes Toplevel geschickter...
Wie auch immer, meistens ist es ratsam, diese Elemente einmal zu erzeugen und dann (falls sie in deinem MW sind) mit packForget und pack aus - und einzublenden.
Im Fall eines Toplevels mit 'deiconify' und 'withdraw'.
Falls Alt-D nicht funktioniert, hat deine Applikation vielleicht keinen Focus?

Grüße, Christoph
Spieler
 2007-11-10 12:50
#102170 #102170
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Hallo,
noch schnell en Beispiel:
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
{my ($gr_frame,$dropdown1,$button1);
sub gruppe_loeschen

{
unless ($gr_frame){ # init
$gr_frame = $main->Frame;

$dropdown1 = $gr_frame->BrowseEntry(-width=> 50,
)->pack(-side => 'top');

$dropdown1->insert(0,'eins','zwei','drei','vier','fünf');

$button1 = $gr_frame->Button(-text => 'Gruppe löschen',
-command => sub{
#irgendetwas
$gr_frame->packForget;
}

)->pack(-side => 'bottom');
}
$gr_frame -> pack;

}
}



Grüße,
Spieler
 2007-11-10 15:54
#102177 #102177
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Krikus+2007-11-10 10:45:24--
&Moin,
Also kann ich Zeile 55-58 weglassen.
Kann aber trotzdem nicht mit ALT+D z.B das Menü Datei aufrufen.


Hallo,

jetzt sehe ich es auch (unter Linux mit 804.027_501): die Bindings für die oberste Menuebene funktionieren nicht. - Unter Windows kein Problem...

Grüße, Christoph
Krikus
 2007-11-11 21:36
#102216 #102216
User since
2007-11-10
13 Artikel
BenutzerIn
[default_avatar]
Besten Dank! Fast perfekt.

Wie kann man herausfinden ob gerade ein Widget aktiv ist.
Wenn nämlich einer nur durch das Menü geht, ohne die Buttons zu betätigen bleiben die Dropdowns und Buttons stehen.

Dann könnte ich eine Sub schreiben, welche immer vorher aufgerufen wird.
Spieler
 2007-11-12 00:48
#102224 #102224
User since
2007-09-24
70 Artikel
BenutzerIn
[default_avatar]
Das kannst du einfach selbst tracken (Aber ich würde echt Toplevel oder Dialoge nehmen für so etwas...):

Grüße, Christoph

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
my $active_frame;
{my ($gr_frame,$dropdown1,$button1);

sub gruppe_loeschen

{
unless ($gr_frame){
$gr_frame = $main->Frame;

$dropdown1 = $gr_frame->BrowseEntry(-width=> 50,
)->pack(-side => 'top');

$dropdown1->insert(0,'eins','zwei','drei','vier','fünf');

$button1 = $gr_frame->Button(-text => 'Gruppe löschen',
-command => sub{
#irgendetwas
$gr_frame->packForget;
}

)->pack(-side => 'bottom');
}
$active_frame->packForget if ($active_frame);
$gr_frame -> pack;
$active_frame = $gr_frame;

}
}

{
my ($frame, $dropdown);
sub benutzer_loeschen

{
unless ($frame){
$frame = $main->Frame;
$dropdown = $frame->BrowseEntry(-width => 50,
)->pack( -side => 'top');
$dropdown->insert(0,'eins','zwei','drei','vier','fünf');

$frame->Button(-text => 'Benutzer löschen',
-command => sub{
#irgendetwas
$frame->packForget;
}

)->pack(-side,'bottom');
}
$active_frame->packForget if ($active_frame);
$frame->pack;
$active_frame = $frame;
}
}
ptk
 2007-11-12 20:09
#102290 #102290
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Alt-X funktioniert, wenn man -type => "menubar" im Skript ersatzlos streicht --- warum, kann ich auf die Schnelle nicht erklären.
Krikus
 2007-12-17 13:44
#103975 #103975
User since
2007-11-10
13 Artikel
BenutzerIn
[default_avatar]
So mein Programm ist nun fertig, aber ich muss eine Dokumentation schreiben.
Köntnem ireiner folgende Zeilen einmal erklären:
Code (perl): (dl )
1
2
3
4
5
unless ($gr_frame){}

$active_frame->packForget if ($active_frame);
     $frame->pack;
     $active_frame = $frame;
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-11-10 00:46.