Les Labels
1. Présentation
Le widget
GtkLabel va nous permettre d'afficher du texte à l'intérieur de nos fenêtres.
1.1 Hiérarchie
GObject ->
GtkObject ->
GtkWidget ->
GtkMisc? ->
GtkLabel
2. Utilisation de base
2.1 Création d'un label
label = gtk.Label(str)
Le paramètre
str n'est autre que le texte qui sera affiché par le
GtkLabel.
2.2 Modification du label
Il peut arriver qu'au cours d'un programme, l'on veuille modifier le texte qui est affiché. La fonction à utiliser est la suivante :
label.set_label(str);
Le paramètre
str est le nouveau texte qui sera affiché.
2.3 Récupération du label
Pour récupérer le texte qui est affiché par un label, la fonction est :
texte = label.get_label()
2.4 Alignement du texte
Maintenant, nous allons voir comment aligner notre texte, lorsque celui-ci comporte plusieurs lignes. Comme d'habitude, GTK+ nous fourni une méthode très simple d'utilisation :
label.set_justify(jtype)
Le paramètre jtype correspond à l'alignement du texte et peut prendre une de ces valeurs :
- gtk.JUSTIFY_LEFT pour aligner le texte à gauche (par défaut) ;
- gtk.JUSTIFY_RIGHT pour aligner le texte à droite ;
- gtk.JUSTIFY_CENTER pour centrer le texte ;
- gtk.JUSTIFY_FILL pour justifier le texte.
Au contraire, pour obtenir l'alignement du texte, la fonction est :
justification = label.get_justify()
2.5 Programme exemple
Nous allons, comme programme exemple, utiliser le classique "Hello Word".
import gtk
def main():
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Les labels")
window.set_default_size(320, 200)
# Creation du label
label = gtk.Label("Hello World!")
# On ajoute le label a l'interieur de la fenetre
window.add(label)
# Affichage de la fenetre et de tout ce qu'il contient
window.show_all()
# Connexion du signal
# On appelle directement la fonction de sortie de boucle
window.connect("destroy", gtk.main_quit, None)
gtk.main()
if __name__ == '__main__':
main()
Résultats

3. Les caractères accentués
Vous avez peut-être déjà essayé d'afficher du texte contenant des caractères tel que "é, è, à, …", et lors de l'exécution, votre texte ne s'affiche pas complètement. Nous allons maintenant voir le pourquoi du comment.
3.1 Application test
Pour vous montrer tout cela, nous allons reprendre l'exemple précédent en remplaçant " Hello Word " par " Texte à afficher ", et cela ne marche pas! En effet vous obtenez cela :
Et en plus sur la console, vous avez le message d'erreur suivant :
** (Label2.py) : WARNING **: Invalid UTF8 string passed to pango_layout_set_text()
3.2 Comment ça marche ?
Pour afficher du texte, Gtk utilise la librairie Pango qui s'occupe du rendu et de l'affichage du texte. Le but de Pango est de permettre l'internationalisation des applications, et pour cela Pango utilise l'encodage UTF8. Ce charset est codée sur 16 bits, ce qui offre la possibilité d'afficher plus de 65000 caractères, permettant ainsi d'afficher des caractères accentués et bien plus (ex : pour le grec, le chinois, ...).
Puisque Pango sait faire tout cela, pourquoi le test n'a-t-il pas fonctionné? Et bien, tout simplement parce que votre système d'exploitation n'utilise pas ce charset. Lorsque vous souhaitez afficher "Texte à afficher", Pango va avant tout vérifier l'encodage d'un caractère et si l'un de ces caractères n'est pas correct, Pango va arrêter son processus de rendu et envoyer un message d'erreur.
Le moyen le plus simple pour voir les effets d'une erreur d'encodage est de changer celui de votre navigateur. Modifiez les options de votre navigateur afin d'utiliser l'encodage UNICODE. Cette page web utilisant le charset iso-8859-1, les caractères accentués deviendront des carrés ou autre chose.
3.3 Solution
La solution la plus simple est de définir l'encodage utilisé par le programme python, en mettant en première ligne :
# -*- Encoding: Latin-1 -*-
Adapter cette ligne avec l'encodage que vous utilisez sur votre système et votre éditeur de texte (utf-8 par exemple).
Ensuite, il faut utiliser des chaines de caractères unicode au lieu de chaines de texte simple.
En python, cela se traduit par remplacer la chaine
"texte accentué" par
u"texte accentué".
3.4 Programme exemple
# -*- Encoding: Latin-1 -*-
import gtk
def main():
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Les labels II")
window.set_default_size(320, 200)
# Creation du label avec un caractère accentué
label = gtk.Label( u"Texte à afficher" )
# On ajoute le label a l'interieur de la fenetre
window.add(label)
# Affichage de la fenetre et de tout ce qu'il contient
window.show_all()
# Connexion du signal
# On appelle directement la fonction de sortie de boucle
window.connect("destroy", gtk.main_quit, None)
gtk.main()
if __name__ == '__main__':
main()
Résultats

4. Formatage du texte
Nous allons maintenant voir comment modifier l'apparence de notre texte (police, couleur, …).
Pour notre application test, nous allons afficher une ligne en Courier gras taille 10, une ligne en Times New Roman italique bleu taille 12, et une ligne en Verdana souligné taille 16. Et tout cela centré (bien sûr).
4.1 Définition du format
Une fois encore, nous allons utiliser les propriétés de Pango (même si nous n'allons pas utiliser les fonctions de Pango directement).
Pour définir le format du texte, il suffit d'insérer des balises à l'intérieur même de notre texte. Pango s'occupe ensuite de rechercher les balises puis de formater le texte à notre convenance.
4.2 Les balises rapides
Les balises rapides servent à mettre le texte en gras, italique ou autre de manière très simple. Voici l'intégralité de ces balises :
- <b> : Met le texte en gras
- <big> : Augmente légèrement la taille du texte
- <i> : Met le texte en italique
- <s> : Barre le texte
- <sub> : Met le texte en indice
- <sup> : Met le texte en exposant
- <small> : Diminue légèrement la taille du texte
- <tt> : Met le texte en télétype
- <u> : Souligne le texte
Pour utiliser ces balises, il suffit d'encadrer le texte à modifier des balises de formatage. Par exemple, pour mettre le texte en gras, il faudra entrer : "Normal vs <b>Gras</b>".
Mais cela ne suffit pas, il faut aussi dire que le texte utilise les balises Pango, ce qui est possible avec la méthode suivante :
label.set_use_markup(setting)
Il faut mettre le paramètre
setting à True, et le texte sera alors formaté en conséquence.
Un autre moyen de spécifier l'utilisation des balises, est d'utiliser cette méthode :
label.set_markup(str)
Cette fonction dit à Pango qu'il faut utiliser les balises, mais elle modifie aussi le label en affichant la chaîne de caractères
str.
4.3 La balise <span>
Cette fois-ci, nous allons étudier la balise <span> en détail. Avec celle-ci, nous allons pouvoir changer la police de caractères, la couleur du texte et bien d'autres choses.
Cette balise s'utilise comme les précédentes si ce n'est qu'elle accepte des paramètres. Le tableau ci-dessous présente tous les paramètres et les effets sur le texte.
- font_family : Pour définir la police à utiliser. Si la valeur donnée à ce paramètre est incorrecte, la police par défaut (Sans Serif) sera utilisée. Exemple : <span font_family=\"Courier New\">Courier New</span>.
- face : Identique à font_family. Exemple : <span face=\"Times New Roman\">Times New Roman</span>.
- size : Pour définir la taille du texte (par défaut 10). Exemple : <span size=\"12\">Taille 12</span>
- style : Pour définir le style du texte. Trois valeurs possibles : normal, oblique, italic. Exemple : <span style=\"oblique\">Oblique</span>
- font_desc : Permet de combiner les paramètres précédents en un seul. Exemple : <span font_desc=\"Courier New italic 12\">Courier New italic 12</span>.
- weight : Permet de définir l'épaisseur des lettres. Les valeurs peuvent être ultralight, light, normal, bold, utrabold, heavy ou encore une valeur numérique. (Vous remarquerez qu'il n'y a que peu ou pas de différence). Exemple : <span weight=\"bold\">Bold</span>
- variant : Pour définir si l'on veut du texte normal (normal) ou en petite majuscule (smallcaps). Exemple : <span variant=\"smallcaps\"> Smallcaps </span>. Afin de pourvoir l'utiliser, il faut avoir la police : nom smallcaps
- stretch : Permet d'étirer le texte. La valeur de ce paramètre peut être : ultracondensed, extracondensed, condensed, semicondensed, normal, semiexpanded, expanded, extraexpanded, ultraexpanded. Afin de pourvoir l'utiliser, il faut avoir la police : nom condensed (ou autre).
- foreground : Pour définir la couleur du texte. Il faut donner la valeur hexadécimale de la palette RVB. Exemple : <span foreground=\"#FF0000\"> Couleur Texte </span>
- background : Pour définir la couleur du fond. Il faut donner la valeur hexadécimale de la palette RVB. Exemple : <span background=\"#FF0000\"> Couleur Texte </span>
- underline : Pour souligner le texte. Exemple : <span underline=\"double\">Double</span>.
- rise : Pour déplacer le texte verticalement.
- strikethrough : Pour barrer le texte. Exemple : <span strikethrough=\"true\">Striketrough = "true"</span>
- lang : Pour indiquer la langue du texte.
Tous ces paramètres peuvent être mis à l'intérieur d'une seule et même balise <span>.
4.4 Programme exemple
# -*- Encoding: Latin-1 -*-
import gtk
def main():
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Les labels III")
window.set_default_size(320,200)
# Creation du label
label = gtk.Label()
# On utilise les balises
# FIXME: j'ai un problème avec la syntaxe du wiki qui m'empêche de mettre trois doubles quotes.
label.set_markup("<span face=\"Courier New\"><b>Courier New 10 Gras</b></span>"
"<span font_desc=\"Times New Roman italic 12\" foreground=\"#0000FF\">Times New Roman 12 Italique</span>\n")
# On centre le texte
label.set_justify(gtk.JUSTIFY_CENTER)
# On ajoute le label a l'interieur de la fenetre
window.add(label)
# Affichage de la fenetre et de tout ce qu'il contient
window.show_all()
# Connexion du signal
# On appelle directement la fonction de sortie de boucle
window.connect("destroy", gtk.main_quit, 0)
gtk.main()
if __name__ == '__main__':
main()
Résultats
