Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]4817[/thread]

Tk::Menu - cascade, Farbproblem: Tk::Menu macht mich noch fertig

Leser: 1


<< >> 5 Einträge, 1 Seite
Ishka
 2004-08-19 15:18
#42494 #42494
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hiho,
ich habe ein kleines Farbproblem bei Tk::Menu.

Und zwar hab ich mein Menü frei nach dem Konfigurierbarkeitsmotto mit ner festlegbaren Farbe eingefärbt:
Code: (dl )
1
2
3
$menu{'ansicht'} = $menu->Menubutton(-text=>'Ansicht',
-background=>$S::farbe, -activebackground=>$S::hfarbe,
-tearoff=>$tearoff)->pack(-side=>'left');


Die Einträge hatten dann auch alle sofort die gleichen Werte. Als ich dann via cascade ein Untermenü angelegt hab, hatte das wieder die alte Farbe.
Code: (dl )
1
2
3
for(0..$#_){$menu{'stationen wahl'}->command(
-label=>$_[$_]->name,-command=>sub {$welche_station=$_},
-background=>$S::farbe,-activebackground=>$S::hfarbe);}

hat dann zwar das Farbproblem halbwegs gelöst, aber außenrum ist immer noch ein grauer Rahmen.

Kann ich den irgendwie wegbekommen (dh auch nach $S::farbe ändern), oder gibt es gar eine globale Einstellung dafür?

Und wenn ich gleich dabei bin mich über Tk::Menu auszuheulen: Ist es wirklich vorgesehen, daß man zum Listenelement löschen
Code: (dl )
$menu{'stationen wahl'}->menu->delete(0,$anzahl);

aufzurufen?

Und was soll diese komische Aufteilung in Menu und Menubutton bringen - und nach welchem Schema geht die vor sich?

Naja - nachdem jetzt fast alles funktioniert, würde mir die Beantwortung meiner ersten Frage reichen.

Ishka
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2004-08-19 16:27
#42495 #42495
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Aus Unkenntnis benutzte ich beim Erstellen von Cascades immer diese Notation:
Code: (dl )
1
2
3
    $menu->cascade(-label => 'Untermenue');
my $um = $menu->Menu(-title => 'Untermenue');
$menu->entryconfigure('last', -menu => $um);

Der Vorteil ist hier aber, dass du dein eigenes Menu-Objekt generierst und dabei auch Farben etc. setzen kannst.

Eine weitere Moeglichkeit ist die Verwendung der Option-DB. Das lohnt sich oft, wenn viele Widgets die gleichen Konfigurationen haben.

Zum Menubutton: brauchst du tatsaechlich Menubutton? Erzeugst du ein "richtiges" Menue in der Menueleiste oder hast du tatsaechlich in deiner Anwendung einen Knopf, an dem ein Menue haengt?

Zum Loeschen: ja, geloescht wird mit delete() und einer Index-Angabe. Wobei man statt des Indexes auch eine Regexp nehmen kann, die gegen den Label des Menueeintrags matcht. Man muss auf jeden Fall darauf achten, dass der tear-off-Eintrag den Index=0 hat, falls vorhanden.
Ishka
 2004-08-19 18:43
#42496 #42496
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Danke, damit funktionierts.

Option-DB? Wie funktioniert das? (ich glaub, genauer Manpagename dürfte reichen)

Menubutton: Ich habe ein reguläres Menü - ich habs auch mit Menu probiert, aber das war mir das Menü viel zu hoch. Höhe reduzieren hab ich nicht hingekriegt und nachdem es mit der vorhergehenden Lösung wunderbar funktioniert hatte, hab ichs wieder zurückgestellt - aber wenn du mir sagst, wie ich die Höhe reduziere..

löschen via RegEx klingt gut
Code: (dl )
$menu{'stationen wahl'}->delete(//);

aber da spuckt er mir aus:
Tk::Error: wrong # args: should be ".frame.menubutton3.menu1 delete first ?last?" at /usr/lib/perl5/Tk.pm line 225.

qr// und '' hab ich auch probiert.

und beim tearoff-Eintrag - auf was matched der beim RegEx?
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2004-08-19 20:05
#42497 #42497
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Ishka,19.08.2004, 16:43]Option-DB? Wie funktioniert das? (ich glaub, genauer Manpagename dürfte reichen)[/quote]Tk::option

Wenn du .Xdefaults aus der X11-Welt kennst, dann duerfte dir das vertraut vorkommen.

Quote
Menubutton: Ich habe ein reguläres Menü - ich habs auch mit Menu probiert, aber das war mir das Menü viel zu hoch. Höhe reduzieren hab ich nicht hingekriegt und nachdem es mit der vorhergehenden Lösung wunderbar funktioniert hatte, hab ichs wieder zurückgestellt - aber wenn du mir sagst, wie ich die Höhe reduziere..

Welches Betriebssystem? Also, ich verwende immer nur den Perl-Stil fuer Menues, wie auch hier.
beschrieben.

Quote
löschen via RegEx klingt gut
Code: (dl )
$menu{'stationen wahl'}->delete(//);

aber da spuckt er mir aus:
Tk::Error: wrong # args: should be ".frame.menubutton3.menu1 delete first ?last?" at /usr/lib/perl5/Tk.pm line 225.

qr// und '' hab ich auch probiert.

Achtung, die Tcl-Welt schaut hier rein! // und qr// geht nicht, man muss schon Strings verwenden. Ich nehme an, dass der leere String falsch interpretiert wird. Vielleicht funktionieren auch keine Regexps, sondern nur Teilstring-Matches --- das muesste in der Manpage stehen. Wenn du aber tatsaechlich alles loeschen willst, bist du mit $menu->delete(0, "end") besser beraten.

Quote
und beim tearoff-Eintrag - auf was matched der beim RegEx?
Wahrscheinlich gar nicht :-) Die Regexp-Variante ist meist nur gut, wenn man gezielt ein Element ansprechen will.
Crian
 2004-08-20 11:57
#42498 #42498
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Zu Menüs: schau Dir mal das untere Beispiel in unserem Perl/Tk-Tutorial an. (Den Quellcode findest Du hier.)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 5 Einträge, 1 Seite



View all threads created 2004-08-19 15:18.