Thread MainLoop blockiert (7 answers)
Opened by theresa at 2008-07-25 14:23

theresa
 2008-07-25 16:10
#112709 #112709
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Ich versuche es besser zu erklären. Es gibt auch noch ein Tray.pm, der auch angezeigt werden soll, für das LoginFenster. Wenn man auf das Tray klickt, soll das LoginFenster irgendwie benachrichtig werden.
Ich habe das so gemacht...
Bin dabei, zu lernen, also offen für allgemeine Kritik :o). Hab erst vor einer Woche ein Buch zur Objektorientierung in Perl ausgeliehen...
Die Dateien:
Tray.pm
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
package Tray;
use Win32::GUI;

use Alias qw(attr);
use vars qw($BILD $TEXT $CONTROLLER $WIN32 @FUNKTIONEN);

my %felder = (
        BILD => undef,
        TEXT => undef,
        CONTROLLER => undef,
        WIN32 => undef,
        FUNKTIONEN => [],
);

sub new {
        my $that = shift;
        my $bildPfad = shift;
        my $text = shift;
        $CONTROLLER = shift;
                        
        my $class = ref($that)||$that;
        my $self = {
                %felder,
        };
        bless $self, $class;
        initWin($bildPfad, $text);
        return $self;
}

sub initWin {
        my $bildPfad = shift;
        my $text = shift;
        my $mw;
        $WIN32 = new Win32::GUI::DialogBox( -width => 0, -height => 0, -name => 'TrayWindow' );
        my $icon_nr = 0;
        my @icon = (new Win32::GUI::Icon( $bildPfad )); 
        new Win32::GUI::NotifyIcon( $WIN32, 
                            -name => "Notify", 
                            -id => 255, 
                            -icon => $icon[$icon_nr], 
                            -tip => $text,
                            -onClick => sub { clicked(); },  
                            #-onRightClick => sub { context_menu($mw, $main_win32); } ); 
                            -onRightClick => sub { context_menu(); } ); 
}

#Rechtsklickmenü aufrufen
sub context_menu { 
        #my $mw = shift;
        
        #my $popup = $mw->Menu( Name => 'popupMenu', -tearoff => 0 ); 
        $popup->command( -label => 'Verbindung trennen', -command => sub { &clean_exit } ); 
        $popup->Popup( -popover => 'cursor', -popanchor => 'nw' ); 
        return 1;
} 

#Hauptfenster verstecken / anzeigen
sub clicked {
        $CONTROLLER->tray_clicked();
}

#Icon verändern
sub toggle_icon {
   $icon_nr = !$icon_nr;
   Win32::GUI::NotifyIcon::Modify( $WIN32,
                                   -id => 255,
                                   -icon => $icon[$icon_nr],
                                   -tip => ' verändertes Icon ' ); 
}

#TrayIcon erntfernen und Beenden
sub clean_exit { 
        $WIN32->Notify->Delete( -id => 255 ); 
        CORE::exit;  
}
1;


LoginFenster.pm
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
package LoginFenster;
use strict;
use Tk;
use vars qw($VERSION);
$VERSION = 0.01;

use Alias qw(attr);
use vars qw($MW);

my %felder = (
        MW=>undef,
);

sub new {
        my $that = shift;
        my $class = ref($that)||$that;
        my $self = {
                %felder,
        };
        bless $self, $class;
        init();
        return $self;
}

sub init {
        $MW = tkinit(-title=> 'Anmeldung');
        #...
        MainLoop;
}

sub isHidden {
        if ($MW->state eq 'withdrawn'){
                return 1;
        }
        return 0;
}

sub raiseup {
        $MW->deiconify;
    $MW->raise;
        $MW->focus;  
}

sub hide {
        $MW->withdraw;
}

sub toggle {
        if(isHidden()){
                raiseup();
        }
        else{
                hide();
        }
}
1;


Controller.pm, soll das ganze steuern
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
package Controller;
use Tray;
use LoginFenster;

use Alias qw(attr);
use vars qw($TRAY $LF $SELF);

my %felder = (
        $TRAY = undef,
        $LF = undef,
        $SELF = undef,
);

sub new {
        my $that = shift;
        my $bildPfad = shift;
        my $text = shift;                        
        my $class = ref($that)||$that;
        my $self = {
                %felder,
        };
        bless $self, $class;
        $SELF = $self;
        init();
        return $self;
}

sub init {
        $TRAY = Tray->new('c:\\pfad', 'text', $SELF);
        $LF = LoginFenster->new();
#       $LF->show();
        print ref($LF);
}

sub tray_clicked {
        $LF->toggle();
}

1;

View full thread MainLoop blockiert