Les décorations
1. Présentation
Maintenant, nous connaissons suffisamment de widgets pour créer des fenêtres complexes. Afin d'améliorer l'esthétique des ces fenêtres nous allons voir comment ajouter des décorations (ou séparation) entre les différentes parties de la fenêtre. Il existe deux types de décoration :
- le cadre GtkFrame qui entoure toute une zone de la fenêtre et qui possède un texte permettant de définir la zone ;
- la ligne GtkSeparator? qui divise en deux parties différentes, le widget GtkHSeparator pour les lignes horizontales et le widget GtkVSeparator pour les lignes verticales.
1.1 Hiérarchie
GObject ->
GtkObject ->
GtkWidget ->
GtkContainer ->
GtkBin? ->
GtkFrame
GObject ->
GtkObject ->
GtkWidget ->
GtkSeparator? ->
GtkHSeparator
GObject ->
GtkObject ->
GtkWidget ->
GtkSeparator? ->
GtkVSeparator
2. Le cadre
2.1 Création
frame = gtk.Frame(label)
Le paramètre
label est tout simplement le texte qui sera affiché en haut à gauche du cadre (position par défaut).
2.2 Modification du texte
Il peut arriver que dans votre application, le texte du cadre nécessite une modification. Bien entendu, le widget
GtkFrame est fourni avec toutes les méthodes nécessaires.
frame.set_label(label)
Le paramètre
label est le nouveau texte à inscrire.
Pour récupérer le texte du
GtkFrame, la méthode est :
texte = frame.get_label()
2.3 Remplacer le texte par un widget
Les cadres offrent aussi la possibilité de remplacer le texte par un widget quelconque (
GtkImage,
GtkStockItem?, ...) grâce à cette méthode :
frame.set_label_widget(label_widget)
Et comme toujours, la méthode permettant de connaître le widget affiché:
widget = frame.get_label_widget()
2.4 Position du texte
Par défaut, la position du texte est en haut à gauche du cadre, centré en hauteur par rapport à la ligne supérieure. Cela aussi peut être modifié avec cette méthode :
frame.set_label_align(xalign, yalign)
Les valeurs
xalign et
yalign doivent être comprises entre 0.0 et 1.0.
Le paramètre
xalign définit la position horizontale du texte. Une valeur de 0.0 positionne le texte à gauche du cadre, tandis qu'une valeur de 1.0 le positionne à droite. Evidemment, une valeur de 0.5 centrera le texte.
Quant à
yalign, il permet de définir la position verticale du texte par rapport à la ligne supérieur du cadre. Une valeur de 0.0 mettra le nommeur en dessous de la ligne et une valeur de 1.0 le mettra au-dessus de la ligne.
On peut, bien sûr, connaître les valeurs de positionnement avec la méthode suivante :
xalign, yalign = frame.get_label_align()
2.5 Style du cadre
Le style du cadre correspond plus à la configuration visuelle des lignes du cadre et plus précisément encore l'ombre des lignes. Cette modification de fait avec cette méthode :
frame.set_shadow_type(type)
Le paramètre
type peut prendre cinq valeurs différentes dont voici la liste avec leurs illustrations :
Et sans surprise, voici la méthode qui permet de connaître le type des lignes :
shadow_type = frame.get_shadow_type()
3. Les lignes
Alors cette fois, cela va être très rapide et très simple.
3.1 Création
hs = gtk.HSeparator()
vs = gtk.VSeparator()
La première classe crée une ligne horizontale alors que la deuxième crée une ligne verticale.
Il n'y a rien de plus à propos de ce widget.
4. Exemple
4.1 Description
Afin de vous montrer l'avantage visuel de l'utilisation des
GtkFrame et
GtkSeparator?, nous allons créer une fenêtre qui demande à l'utilisateur de saisir des informations le concernant (nom, prénom, adresse, ...).
Voila à quoi ressemble la fenêtre sans l'utilisation des décorations :
Attention, ce programme ne fait rien du tout, c'est simplement pour montrer la différence entre avec et sans les décorations.
4.2 Programme exemple
# -*- Encoding: Latin-1 -*-
import gtk
def main():
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
# On ajoute un espace de 5 sur les bords de la fenetre
window.set_border_width(5)
window.set_title("GtkEntry et GtkSeparator")
window.set_default_size(320, 200)
window.connect("destroy", gtk_main_quit, None)
vbox = gtk.VBox(True, 0)
window.add(vbox)
# Creation du premier GtkFrame
frame = gtk.Frame("Etat civil")
vbox.pack_start(frame, True, False, 0)
# Creation et insertion d une boite pour le premier GtkFrame
vbox_frame = gtk.VBox(True, 0)
frame.add(vbox_frame)
# Creation et insertion des elements contenus dans le premier GtkFrame
label = gtk.Label("Nom :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
pLabel = gtk_.Label(u'Prénom')
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
# Creation d un GtkHSeparator
separator = gtk.HSeparator()
vbox_frame.pack_start(separator, True, False, 0)
pLabel = gtk.Label("Date de naissance :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
# Creation du deuxieme GtkFrame
frame = gtk.Frame("Domicile")
vbox.pack_start(frame, True, False, 0)
# Creation et insertion d une boite pour le deuxieme GtkFrame
vbox_frame = gtk.VBox(True, 0)
frame.add(vbox_frame)
# Creation et insertion des elements contenus dans le deuxieme GtkFrame
pLabel = gtk.Label("Adresse :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
label = gtk.Label("Adresse :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
label = gtk.Label("Code postal :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
label = gtk.Label("Ville :")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
# Creation du troisieme GtkFrame
frame = gtk.Frame(u'Téléphones')
vbox.pack_start(frame, True, False, 0)
# Creation et insertion d une boite pour le troisieme GtkFrame
vbox_frame = gtk.VBox(True, 0)
frame.add(vbox_frame)
# Creation et insertion des elements contenus dans le troisieme GtkFrame
label = gtk.Label("Domicile")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
label = gtk.Label("Professionnel")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
label = gtk.Label("Portable")
vbox_frame.pack_start(label, True, False, 0)
entry = gtk.Entry()
vbox_frame.pack_start(entry, True, False, 0)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()
Résultat :