GtkFr - Cours Gtk+-2

PyLesPagesAOnglets

PageAccueil :: LesNews :: Telechargement :: Liens :: Forum :: LeChat :: Contact
DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes 38.107.191.92
<< Les zones de texte PyGtk Les listes et arbres? >>


Les pages à onglets

1. Présentation

Nous allons étudier dans ce chapitre les pages à onglets qui sont souvent utilisés dans les fenêtres de configuration. Pour cela nous allons utiliser le widget gtk.Notebook qui dérive du widget gtk.Container.

1.1 Hiérarchie

gobject.GObject -> gtk.Object -> gtk.Widget -> gtk.Container -> gtk.Notebook

2. Utilisation de base

2.1 Création

Pour ne pas changer la création du widget en lui-même est très simple :
notebook = gtk.Notebook_new()
Maintenant que notre widget est créé, nous allons lui ajouter des pages.

2.2 Insertion de pages

Nous avons là aussi trois méthodes qui restent très classiques :
notebook.append_page(child, tab_label=None)
notebook.prepend_page(child, tab_label=None)
notebook.insert_page (child, tab_label=None, position=-1)
La première méthode ajoute une nouvelle page à onglet à la suite des autres, la deuxième méthode l'ajoute au début, et la dernière l'ajoute à une position particulière.
Le premier paramètre, child, est le widget qui sera insérer dans la nouvelle page, et le deuxième (tab_label) le widget qui sera affiché dans l'onglet. Si ce dernier n'est pas passé en paramètre, alors rien ne sera affiché dans l'onglet.
La troisième méthode demande un paramètre supplémentaire (position) qui est la position à laquelle il faut ajouter la page. Si la valeur n'est pas correcte (négative ou trop grande) la page sera ajoutée à la suite des autres. Par défaut, si on ne spécifie pas ce paramètre, la page sera ajoutée à la suite des autres.

2.3 Gestion des pages

Nous allons maintenant voir les méthodes qui permettent de connaître le nombre de page, la page en cours ainsi que d'autres méthodes.
Tout d'abord, la méthode suivante permet de connaître le nombre total de pages contenus dans le gtk.Notebook :
notebook.get_n_pages()
Ensuite, pour connaître le numéro de la page courante, nous avons cette méthode :
notebook.get_current_page()
Par contre pour connaître le numéro d'une autre page que la courante, il faudra utiliser cette méthode :
notebook.page_num(child)
Cette méthode permet d'obtenir le numéro de la page contenant le widget child, ce qui impose donc d'avoir garder une trace de ce widget pour pouvoir utiliser cette méthode.
Avec un numéro de page, nous allons pouvoir récupérer une référence sur le widget qui est contenu dans la page avec cette méthode :
notebook.get_nth_page(page_num)
Ou bien nous allons pouvoir tout simplement supprimer la page :
notebook.remove_page(page_num)
Et pour terminer, voici trois méthodes de navigation :
notebook.next_page()
notebook.prev_page()
notebook.set_current_page (page_num)
La première méthode passe de la page courante à la page suivante. Si la dernière page est déjà affichée, il ne se passera rien.
La deuxième méthode, elle, passe de la page courante à la page précédente. Bien entendu, si la page courante est déjà la première cette méthode n'aura aucun effet.
La dernière méthode quant à elle passe directement à une page précise. Si la valeur de page_num est négative, nous passerons à la dernière page, par contre si cette valeur est trop grande, aucune action ne sera faite.

2.4 Gestion des labels

Nous allons maintenant voir comment modifier ou récupérer le label d'une page. Attention pour chacune de ces méthodes, il faut connaître le widget contenu dans la page.
Tout d'abord, pour récupérer le label de la page, il existe deux fonctions différentes :
notebook.get_tab_label_text(child)
notebook.get_tab_label(child)
La première méthode renvoie directement le label de la page sous la forme d'une chaîne de caractère. Cette méthode ne fonctionnera correctement uniquement si le label de la page est un gtk.Label, car comme nous l'avons vu lors de l'étude des méthodes d'insertion de pages, il est possible de définir le label comme autre chose qu'un gtk.Label. Dans ce cas, il faut utiliser la deuxième méthode qui elle renvoie le widget qui a été utilisé lors de la création.
Pour définir un nouveau label pour une page, il existe là aussi deux méthodes :
notebook.set_tab_label_text(child, tab_text)
notebook.set_tab_label(child, tab_label=None)
La première méthode permet de définir un label de type gtk.Label. Cette méthode s'occupe de la création du gtk.Label et de son insertion dans l'onglet de la page. La deuxième méthode permet d'insérer n'importe quel widget dans l'onglet, comme pour les méthodes de création. Dans le cas de la deuxième méthode, si le paramètre tab_label n'est pas défini, le label de la page sera un label par défaut.

2.5 Modification des propriétés des onglets

Nous allons maintenant voir comment modifier trois des propriétés d'un gtk.Notebook. Tout d'abord voyons comment gérer la position des onglets :
notebook.set_tab_pos(pos)
notebook.get_tab_pos()
La première méthode permet de modifier la position des onglets. C'est le paramètre pos qui définit sa position, et il doit prendre une des valeurs suivantes :
La deuxième méthode permet au contraire de connaître la position des onglets. La valeur de retour est obligatoirement une des quatre valeurs précédentes.
Ensuite nous allons pouvoir définir si les onglets doivent s'afficher ou pas avec ces méthodes :
notebook.set_show_tabs(show_tabs)
notebook.get_show_tabs()
Si nous voulons modifier ce paramètre, il faut utiliser la première méthode en mettant le paramètre show_tabs à True pour les afficher et à False dans le cas contraire. La deuxième méthode permet quant à elle de connaître l'état de cette propriété.
Et enfin, pour terminer nous allons voir comment ajouter deux boutons de navigation à la fin des onglets, pour le cas où il y aurait trop d'onglets à afficher :
notebook.set_scrollable(scrollable)
notebook.get_scrollable()
Si nous mettons le paramètre scrollable de la première méthode à True, deux boutons de navigation apparaîtront et une partie seulement des onglets sera affichée. Pour accéder aux autres onglets il faudra utiliser ces nouveaux boutons.
Bien entendu, la deuxième méthode permet de savoir si les boutons de navigation sont présents ou pas.

2.6 Programme exemple

Nous allons créer un programme qui insèrera un gtk.Notebook de 8 pages dans une fenêtre. Chaque page contiendra uniquement un label "Je suis le gtk.Label numero x". Il y a aussi un bouton qui permettra d'afficher les informations de la page sélectionnée dans une boîte de dialogue.
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk

def main():
  window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  window.set_default_size(320, 200)
  window.set_title('gtk.Notebook')
  window.connect('destroy', gtk.main_quit, 0)

  box = gtk.VBox()
  window.add(box)

  button = gtk.Button('Informations')
  box.pack_start(button, False, False)

  # Création du gtk.Notebook
  notebook = gtk.Notebook()
  box.pack_start(notebook)
  # Position des onglets : en bas
  notebook.set_tab_pos(gtk.POS_BOTTOM)
  # Ajout des boutons de navigation
  notebook.set_scrollable(True)

  for i in range(8):
    # Création des différents gtk.Label
    label = gtk.Label('Je suis le gtk.Label numéro : ' + str(i))
    tab_label = gtk.Label('Page ' + str(i))

    # Insertion de la page
    notebook.append_page(label, tab_label)
  
  button.connect('clicked', on_button, notebook)

  window.show_all()

  gtk.main()

def on_button(button, notebook):
  # Récupération de la page active
  page_num = notebook.get_current_page()
  # Récupération du widget enfant
  child = notebook.get_nth_page(page_num)

  # Récupération du label
  str_label = child.get_text()
  # Récupération du label de l'onglet
  str_tab_label = notebook.get_tab_label_text(child)

  # Création du label de la boîte de dialogue
  dialog_text = 'C\'est la page ' + str(page_num) + '\n' + \
      'Le label est "' + str_label + '"\n' + \
      'Le label de l\'onglet est "' + str_tab_label + '"\n'

  dialog = gtk.MessageDialog(flags = gtk.DIALOG_MODAL,
      type = gtk.MESSAGE_INFO,
      buttons = gtk.BUTTONS_OK,
      message_format = dialog_text)

  dialog.run()
  dialog.destroy()

if __name__ == '__main__':
  main()
Résultats :






3. Ajouter un menu de navigation

Nous allons maintenant voir comment ajouter un menu qui apparaîtra lorsque nous ferons un clic droit de la souris sur une page du gtk.Notebook. Cela ne se fait pas par le biais du widget gtk.Menu mais directement avec les méthodes de gtk.Notebook.

3.1 Création

Pour avoir un gtk.Notebook avec un menu de navigation, trois nouvelles méthodes de création sont disponibles :
notebook.append_page_menu(child, tab_label=None, menu_label=None)
notebook.prepend_page_menu(child, tab_label=None, menu_label=None)
notebook.insert_page_menu(child, tab_label=None, menu_label=None, position=-1)
La majorité des paramètres de ces trois méthodes sont identiques sauf pour le paramètre menu_label qui est le widget qui sera affiché dans le menu de navigation. Le fonctionnement des ces méthodes est le même que pour les méthodes sans menu.
Ensuite pour activer ou désactiver la possibilité d'afficher le menu il faut utiliser une de ces méthodes :
notebook.popup_enable()
notebook.popup_disable()
La première méthode permet d'afficher le menu, et la deuxième au contraire empêche le menu de s'afficher.

3.2 Gestion des labels

Comme pour les onglets, il existe des méthodes pour gérer les labels du menu. Pour récupérer le widget ou directement le texte du menu, nous avons ces deux méthodes :
notebook.get_menu_label (child)
notebook.get_menu_label_text(child)
La première méthode renvoie donc le widget, quel qu'il soit, qui est à l'intérieur du menu alors que la seconde renvoie le texte du menu si l'élément est de type gtk.Label.
Et pour changer le label du menu, il existe ces deux méthodes :
notebook.set_menu_label(child, menu_label)
notebook.set_menu_label_text(child, menu_text)
La première accepte n'importe quel type de widget, tandis que la seconde crée elle-même un widget de type gtk.Label avec comme texte la valeur du paramètre menu_text.

3.3 Programme Exemple

Nous allons reprendre le même exemple que pour la première partie en rajoutant le menu de navigation.
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk

def main():
  window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  window.set_default_size(320, 200)
  window.set_title('gtk.Notebook')
  window.connect('destroy', gtk.main_quit, 0)

  box = gtk.VBox()
  window.add(box)

  button = gtk.Button('Informations')
  box.pack_start(button, False, False)

  # Création du gtk.Notebook
  notebook = gtk.Notebook()
  box.pack_start(notebook)
  # Position des onglets : en bas
  notebook.set_tab_pos(gtk.POS_BOTTOM)
  # Ajout des boutons de navigation
  notebook.set_scrollable(True)

  for i in range(8):
    # Création des différents gtk.Label
    label = gtk.Label('Je suis le gtk.Label numéro : ' + str(i))
    tab_label = gtk.Label('Page ' + str(i))
    menu_label = gtk.Label('Menu -> Page ' + str(i))

    # Insertion de la page
    notebook.append_page_menu(label, tab_label, menu_label)
 
  # Activation du menu popup
  notebook.popup_enable()
  button.connect('clicked', on_button, notebook)

  window.show_all()

  gtk.main()

def on_button(button, notebook):
  # Récupération de la page active
  page_num = notebook.get_current_page()
  # Récupération du widget enfant
  child = notebook.get_nth_page(page_num)

  # Récupération du label
  str_label = child.get_text()
  # Récupération du label de l'onglet
  str_tab_label = notebook.get_tab_label_text(child)
  # Récupération du label du menu popup
  str_menu_label = notebook.get_menu_label_text(child)

  # Création du label de la boîte de dialogue
  dialog_text = 'C\'est la page ' + str(page_num) + '\n' + \
      'Le label est "' + str_label + '"\n' + \
      'Le label de l\'onglet est "' + str_tab_label + '"\n' + \
      'Le label du menu est "' + str_menu_label + '"\n'

  dialog = gtk.MessageDialog(flags = gtk.DIALOG_MODAL,
      type = gtk.MESSAGE_INFO,
      buttons = gtk.BUTTONS_OK,
      message_format = dialog_text)

  dialog.run()
  dialog.destroy()

if __name__ == '__main__':
  main()
Résultats :





<< Les zones de texte PyGtk Les listes et arbres? >>

Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]
Apinc