Bonjour à tous,
J'ai besoin de votre aide pour résoudre une petit soucis...
Je tente de développer une application utilisant une fenêtre principale en mode plein écran. À partir de cette fenêtre principale, je veux ouvrir une fenêtre secondaire permettant l'entrée de données spécifique à une tâche. Le code fourni ci-bas (en grande partie trouvé sur le net et en passant merci à tout ceux qui veulent bien partager leur expérience), permet de faire exactement ce que je désire.
Le seul petit problème, c'est que lorsqu'une fenêtre secondaire (dans ce cas c'est Inscription) est active et que les touches Alt-Tab sont utilisée pour naviguer d'une application à une autre, le focus semble ne pas revenir sur la fenêtre secondaire ce qui empêche de retourner à l'application.
Votre aide vous experts ;-) serait fort apprécié.
Voici le code de la fenêtre principale :
Enfin le code de la fenêtre secondaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/perl -w # Enduro.pl use strict; use Tk; use Inscription; # Main Window my $mw = new MainWindow; my $w = $mw->screenwidth; my $h = $mw->screenheight; $mw->overrideredirect (1); $mw->MoveToplevelWindow (0,0); $mw->geometry (join('x',$w,$h)); # Create a "control window" my $control = $mw->Toplevel ( -title => 'Enduro Timing System', ); $control->geometry ("50x50"); $control->MoveToplevelWindow(-150,-150); # Bind FocusIn on the control window $control->bind ('<FocusIn>', sub { $mw->focusForce; }); # Create the Canvas my $canvas = $mw->Canvas ( -width => 1024, -height => 768, -takefocus => 0, -highlightthickness => 0 ); $canvas->pack; # Create all widgets for the Main Window my $menu = $mw -> Menubutton ( -text => 'Options' , -tearoff => 0 , -menuitems => [ [ 'command' => 'Inscription' , -command => \&Cmd_inscription ] , [ 'command' => 'Événement' , -command => \&Cmd_event ] , '-' , [ 'command' => 'Quitter' , -command => sub { exit ( 0 ) ; } ] ] ) ; # Place all the widgets on the screen $canvas->createWindow(100, 10, -height => 25, -width => 100, -window => $menu ); # Start the main Loop MainLoop(); #------------------------------------------------------------------------------ # Used to launch the Inscription Window #------------------------------------------------------------------------------ sub Cmd_inscription { #&disableFocus(); my ( $fille , $chaine ) ; $fille = $mw -> Inscription ( ) ; $chaine = $fille -> Show ( ) ; print "$chaine\n" ; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/perl -w # Inscription.pm use strict; package Inscription ; use base qw ( Tk::Toplevel ) ; # widget composite de type Toplevel Construct Tk::Widget 'Inscription' ; sub Populate { my ( $this , $args ) = @_ ; my ( $bouton , $zone_saisie ) ; $this -> SUPER::Populate ( $args ) ; # appel de la méthode Populate de la classe mère $this -> {'texte'} = '' ; $this -> {'bouton'} = '' ; $this -> transient ( $this -> Parent -> toplevel ) ; # transfuge $this -> withdraw ( ) ; # retrait de la fenêtre de l'écran $this -> protocol ( 'WM_DELETE_WINDOW' => sub { } ) ; # interdit la fermeture # de la fenêtre $zone_saisie = $this -> Entry ( -textvariable => \$this -> {'texte'} ) ; $zone_saisie -> pack ( -padx => 2 , -pady => 2 ) ; $bouton = $this -> Button ( -text => 'Valider' , -command => sub { $this -> {'bouton'} = 'Ok' ; } ) ; $bouton -> pack ( -padx => 2 , -pady => 2 ) ; } sub Wait { my ( $this ) = @_ ; $this -> waitVariable ( \$this->{'bouton'} ) ; # attend que la valeur de l'attribut # 'bouton' soit modifiée $this -> grabRelease ( ) ; # relache la capture des événements $this -> withdraw ( ) ; # retrait de la fenêtre de l'écran } sub Show { my ( $this ) = @_ ; my ( $of , $og ) ; $of = $this -> focusSave ; # mémorisation de la configuration courante du Focus $og = $this -> grabSave ; # mémorisation de la configuration courante de la Capture $this -> Popup ( ) ; # afficher la fenêtre $this -> grab ( ) ; # capture locale des événements $this -> focus ( ) ; # la fenêtre se voit attribuer le focus $this -> Wait ( ) ; # appel à la méthode Wait $of -> ( ) ; # restauration de la configuration du Focus $og -> ( ) ; # restauration de la configuration de la Capture return $this -> {'texte'} ; } 1 ;
Partager