Thread Tk und Win32::GUI -> Tray, diverse Probleme (4 answers)
Opened by GoodFella at 2007-09-04 19:19

GoodFella
 2007-09-04 19:19
#99083 #99083
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Hi,
ich versuche gerade, ein venünftiges Tray mit Tk und Win32::GUI zu bauen, vorab erstmal mein Testscript:

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
use Win32::GUI; 
use Tk; 
use strict;
use warnings;

my $current_id = 1;
my $is_in_tray = 0;
my $unmap_trigger = 0;

my $main_win32 = new Win32::GUI::DialogBox( -width => 0, -height => 0, -name => 'MainWindow' );
my $icon = new Win32::GUI::Icon( 'test.ico' ); 

my $main = MainWindow -> new; 
$main->geometry('100x100'); 
#$main->overrideredirect(1);

$main->protocol( 'WM_DELETE_WINDOW' => [ \&minimize_to_tray ] ); 
$main->bind("<Unmap>",sub{ $unmap_trigger++; 
                           if ($unmap_trigger % 3 == 0)
                            { 
                              $main->withdraw;                              
                              &minimize_to_tray; 
                            }
                         }
           ); 

my $btn_minimize = $main->Button( -text => 'Minimize', -command => [ \&minimize_to_tray ] );
my $btn_close = $main->Button( -text => 'Close', -command => [ \&clean_exit ] );

$btn_minimize->place( -x => 10, -y => 5 );
$btn_close->place( -x => 10, -y => 30 );

MainLoop; 

sub context_menu
 { 
  my $popup = $main->Menu( Name => 'popupMenu', -tearoff => 0 ); 
  $popup->command( -label => 'Beenden', -command => [ \&clean_exit ] ); 
  $popup->Popup( -popover => 'cursor', -popanchor => 'nw' ); 
  return 1;
 } 

sub raise_main
 {
  $is_in_tray = 0;
  $main->deiconify;
  $main->raise;
  $main->focus;
  return -1;
 }

sub minimize_to_tray
 {
  $is_in_tray = 1;
  $main->withdraw;
  new Win32::GUI::NotifyIcon( $main_win32, 
                              -name => "Notify", 
                              -id => ++$current_id,
                              -icon => $icon, 
                              -tip => "M.A.M.A.",
                              -onClick => sub { &raise_main; },
                              -onRightClick => sub { &context_menu; } ); 
  my $call = Win32::GUI::Dialog(); 
  $main_win32->Notify->Delete( -id => $current_id ); 
 }

sub clean_exit { $main_win32->Notify->Delete( -id => $current_id ) if ($is_in_tray == 1); exit(0);  } 


Zum Test muss sich test.ico im selben Verzeichnis befinden.

Folgendes funktioniert nicht wie erwartet:

1. Klickt man auf den Minimize-Button, dann Rechtsclick auf das Tray-Symbol, und schliesslich auf Beenden, dann kommt ein merkwürdiger OK-Abbrechen Dialog mit dem Text "_TK_EXIT_(0)" und dem Titel "RightClick", ausserdem bleibt das Programm dann im Speicher. Der Close-Button jedoch funktioniert bestens.

2. Das Minimieren, welches ich per unmap abfange, scheint mir sehr unsauber zu sein, gibts da nicht besseres?

3. Wechsle ich mehr als 1 Mal zwischen Tray und "Normal", so erscheint beim erneuten Aufruf des Tray KEIN Tray-Symbol, sondern gar nichts, das Programm bleibt im Speicher und man hat keine Möglichkeit mehr, es zu beenden (ausser mit dem Taskmanager)
Ich habe zuerst gedacht, es läge an der id, da diese ja gelöscht wird.. habe also die id sich erhöhen lassen, leider kein Effekt.


Habe ich etwas übersehen? Habt ihr eine Idee woran das liegt? Ich sitze jetzt schon seit 2 Tagen daran...

View full thread Tk und Win32::GUI -> Tray, diverse Probleme