Fenêtre sans bordure

 


Pourquoi

Parce qu'on ne veut pas qu'elle soit décorée par le gestionnaire de fenêtre (exemple: Ecran de démarrage) ou parce que l'on désire une fenêtre la plus discrète possible.

Dans le premier cas, un wm overrideredirect .ma_toplevel 1 suffit.

Dans le deuxième cas, cela se corse si l'on veut que la fenêtre en question réagisse aux actions souris et clavier. En effet, la fenêtre ne peut recevoir des actions clavier que si elle est active (si elle a le focus). Le overrideredirect fait qu'elle n'est plus connue du gestionnaire de fenêtre et qu'elle ne peut être activée au clavier (Alt+TAB sur certains OS)


Comment

En trichant un peu.

Nous ne mettrons pas le overrideredirect sur la fenêtre . mais sur une autre toplevel. La fenêtre . sera poussée hors écran, elle est donc toujours connue du gestionnaire de fenêtres et peu être activée au clavier. On associe les binding clavier à la toplevel sans bordure et à .

Exemple: Si le mot KeyPress est précédé d'un +, l'action clavier a été détectée par ., sinon par la toplevel sans bordure .slave

 # Forcement, Tk requis
 package require Tk

 # Un callback simple pour la demo
 proc CB {evt {key ""} {msg ""}} {
    set txt $evt
    if {$key ne ""} {
      append txt " ->" $key "<- "
    }
    if {$msg ne ""} {
      append txt " " $msg
    }
    .slave.log configure -text $txt
 }

 # La fenêtre principale
 wm withdraw .
 wm geometry . =1x1

 # Le fenêtre esclave
 toplevel .slave

 # Quelques widgets pour la demo
 pack [label .slave.l -bg red \
    -text "Right click to quit"] -fill both -expand true
 pack [label .slave.log -bg white] -fill both -expand true

 # Suppression des decorations sur l'esclave
 wm withdraw .slave
 wm overrideredirect .slave true
 wm geometry .slave +200+200

 # Bindings pour la fenetre esclave
 bind .slave "<KeyPress>" [list CB KeyPress %K "%A (%k)"]
 bind .slave "<FocusIn>" [list CB FocusIn]
 bind .slave "<FocusOut>" [list CB FocusOut]
 bind .slave <1> {focus -force .slave}
 bind .slave <3> {destroy .slave}

 # Bindings pour la fenetre maître
 bind . "<Alt-KeyPress-q>" {destroy .slave}
 bind . "<KeyPress>" [list CB +KeyPress %K "%A (%k)"]

 # Affichage de la fenetre et passage hors écran
 wm deiconify .
 raise .
 wm geometry . -10000+0

 wm deiconify .slave
 # On peut forcer le focus au demarrage, si c'est le comportement
 # souhaite. Sinon, voir ci-dessus pour obtenir le focus a la demande
 # par un clic gauche.
 raise .slave
 focus -force .slave

 # C'est parti
 tkwait window .slave
 exit

Discussion


Catégorie Exemple | Catégorie Interface Utilisateur