Schrift
[thread]11122[/thread]

TopLevel-Fenster schließen, wenn Klick außerhalb

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
GwenDragon
 2008-01-10 16:25
#104553 #104553
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Und welche Programmbibliotheken/Perl-Module verwendest du denn beim Erstellen der Benutzeroberfläche?
Gast Gast
 2008-01-10 15:32
#104568 #104568
Hallo Gemeinde,

ich habe ein Kontextmenü simuliert. Und will jetzt, diese schließen, wenn mit der Maus außerhalb gelickt wird (so wie bei der echten).

Geht das? Vielen Dank schon mal!

Alex
styx-cc
 2008-01-10 19:01
#104570 #104570
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Zeig doch einfach mal deinen Code, dann kann man wenigstens sehen, wie du das Kontextmenu initialisierst..
Pörl.
Gast Gast
 2008-01-11 10:01
#104607 #104607
Hallo,

danke schon mal für die Antworten. Mein Code sieht zunächst so aus
Code (perl): (dl )
1
2
3
4
5
6
7
### Test.pl
use KMenueTest;

use Tk;
my $w = KMenueTest->new;

MainLoop;


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
package KMenueTest;

use strict;
use Tk;
use Tk::Toplevel;

sub new
{
    my($class) = @_;
    my $this = bless({
        MW => MainWindow->new
       }, $class);
    
    my $lab = $this->{MW}->Label(-text => 'Klick hier')->pack;
    
    $this->{MW}->bind($lab, '<1>' => [ 
        \&Click_Event, $this, Ev('X'), Ev('Y') ]
    );
    
    return $this;
}

sub Click_Event
{
    my($mw, $this, $x, $y) = @_;
    
    $this->Close_KMenue if $this->{KMenueOpen};
    
    my $kmenue = $mw->Toplevel(qw/-bd 1 -relief raised/);
    
    $kmenue->overrideredirect(1);
    $kmenue->geometry(sprintf("+%d+%d", $x, $y));
    
    my %opt = qw/-activebackground darkblue 
        -activeforeground white 
        -width 20 -height 1 -bd 0 -anchor w/;
    
    $kmenue->Button(%opt, -text => "Test1"
        , -command => [ \&Test, $this, 1 ])->pack;
    
    $kmenue->Button(%opt, -text => "Test2"
        , -command => [ \&Test, $this, 2 ])->pack;
    
    $this->{KMenue} = $kmenue;
    $this->{KMenueOpen} = 1;
}

sub Test
{
    my($this, $param) = @_;
    print "Test $param\n";
    $this->Close_KMenue;
}

sub Close_KMenue
{
    my($this) = @_;
    $this->{KMenue}->destroy;
    $this->{KMenue} = undef;
    $this->{KMenueOpen} = 0;
}

1;


Wenn ich auf den Label klicke, wird das Menü angezeigt. Wie kann ich das Menü schließen, wenn auch außerhalb von MainWindow geklickt wird. Also Desktop bspw.?

Vielen Dank!
Struppi
 2008-01-11 14:56
#104619 #104619
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Probier mal:
Code (perl): (dl )
$this->{MW}->bind('<FocusOut>', sub {$this->Close_KMenue;});


EDIT: ja, das ist nur die halbe Lösung, da du so keinen Eintrag mehr auswählen kannst. Aber ich denke das ist schonmal ein Weg.
Gast Gast
 2008-01-14 10:56
#104682 #104682
Das ist aber schade. Ohne, dass ich was auswählen kann, kann ich es nicht gebrauchen :(.

Gibt es da noch eine Möglichkeit? Vielleicht generell Mausklick abfangen? Wie ist es bei der "echten" K-Menü implementiert? Ich suche mal...
Gast Gast
 2008-01-14 14:37
#104702 #104702
Wie wärs mit <Leave> ?
Schon ausprobiert?

MfG Horst
Gast Gast
 2008-01-14 15:42
#104708 #104708
habe gerade ausprobiert.

Mit
Code (perl): (dl )
$this->{MW}->bind('<Leave>', sub { $this->Close_KMenue; });

kann ich nichts Auswählen. Menü verschwindet schneller, als ich klicken kann :)

bei:
Code (perl): (dl )
$kmenue->bind('<Leave>', sub { $this->Close_KMenue; });

habe ich nur die Möglichkeit den ersten Eintrag auszuwählen. Sobald Mauszeiger den oberen Button verlassen hat (nach unten) verschwindet das Menü...

Danke trotzdem für den Vorschlag!
Strat
 2008-01-14 17:24
#104714 #104714
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vielleicht einfach mal schauen, wie die Autoren von Tk-Modulen machen, z.B. Tk::BrowseEntry oder aehnliche...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2008-01-14 18:14
#104716 #104716
Ich hab gerade mal ein bisschen rumprobiert, und herausgefunden, dass es mit <FocusOut> sehr gut funktioniert!
Du musst nur dem Menü den Fokus geben, wenn es gezeigt wird. ( mittels $m->focus )

Als kleines Beispiel eine Menüklasse mit Schatten (aufgeteilt in mehere Antworten):
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
54
55
56
57
58
59
60
package Tk::KMenu;

use strict;
use warnings 'all';

use Tk;
use Tk::Toplevel;

sub new
{
my( $class, $top ) = @_; # pick parameters

my $obj = { # create reference
container => $top -> Toplevel( # create and save new toplevel window
-bd => 1,
-relief => 'raised',
),
shadow => $top -> Toplevel( # create a shadow window
-background => '#0f0f0f', # set the background to really dark grey
),
menu => [], # save menu entries
};
bless $obj, $class; # bless the reference

$obj->{container} -> overrideredirect( 1 ); # delete menu border
$obj->{shadow} -> overrideredirect( 1 ); # delete shadow border
$obj->close; # don't show menu until ->show

# if the menu loses focus, close it
$obj->{container} -> bind(
'<FocusOut>' => sub {
$obj->close;
},
);

return $obj; # return object
} # new

sub add
{
my( $self, @pairs ) = @_; # pick parameters

for( my $i = 0; $i < @pairs; $i += 2 ) { # iterate over @pairs
# add a menu entry
push(
@{ $self->{menu} },
$self->{container} -> Button(
-text => $pairs[$i],
-anchor => 'w',
-relief => 'flat',
-bd => 1,
-command => $pairs[$i+1],
) -> pack(
-fill => 'x',
),
);
} # foreach

return $self; # return object
} # add
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2008-01-10 15:32.