Blame platform-demos/fr/model-view-controller.py.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="model-view-controller.py" xml:lang="fr">
Packit 1470ea
Packit 1470ea
<info>
Packit 1470ea
    <title type="text">The Model/View/Controller design (Python)</title>
Packit 1470ea
  <link type="guide" xref="beginner.py#theory"/>
Packit 1470ea
  <link type="next" xref="combobox_multicolumn.py"/>
Packit 1470ea
  <revision version="0.1" date="2012-06-30" status="stub"/>
Packit 1470ea
Packit 1470ea
  <desc>Le concept Modèle/Vue/Contrôleur</desc>
Packit 1470ea
  <credit type="author copyright">
Packit 1470ea
    <name>Sebastian Pölsterl</name>
Packit 1470ea
    <email its:translate="no">sebp@k-d-w.org</email>
Packit 1470ea
    <years>2011</years>
Packit 1470ea
  </credit>
Packit 1470ea
  <credit type="author copyright editor">
Packit 1470ea
    <name>Marta Maria Casetti</name>
Packit 1470ea
    <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
    <years>2012</years>
Packit 1470ea
  </credit>
Packit 1470ea
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Rebert,</mal:name>
Packit 1470ea
      <mal:email>traduc@rebert.name</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Alain Lojewski,</mal:name>
Packit 1470ea
      <mal:email>allomervan@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-2012</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luc Pionchon</mal:name>
Packit 1470ea
      <mal:email>pionchon.luc@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Bruno Brouard</mal:name>
Packit 1470ea
      <mal:email>annoa.b@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011-12</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Luis Menina</mal:name>
Packit 1470ea
      <mal:email>liberforce@freeside.fr</mal:email>
Packit 1470ea
      <mal:years>2014</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Le concept Modèle/Vue/Contrôleur</title>
Packit 1470ea
Packit 1470ea
<links type="section"/>
Packit 1470ea
Packit 1470ea
<section id="overview">
Packit 1470ea
<title>Présentation</title>
Packit 1470ea
Packit 1470ea

Les deux éléments graphiques <link xref="treeview_simple_liststore.py">TreeView</link> et <link xref="combobox.py">BoiteCombinee</link> sont construits sur le concept Modèle/Vue/Contrôleur. Le Modèle (une implémentation de Gtk.TreeModel, habituellemnt soit Gtk.TreeStore, soit Gtk.ListStore) stocke les données ; laVue (par ex. Gtk.TreeView, Gtk.ComboBox, ou Gtk.ComboBoxText) obtient les notifications de modifications et affiche le contenu du modèle. Enfin, le Contrôleur modifie l'état du modèle (à l'aide de méthodes dans l'implémentation du modèle, comme append(), ou remove()) et indique à la Vue ces modifications (à l'aide de signaux comme "changed").

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="model">
Packit 1470ea
<title>Le Modèle</title>
Packit 1470ea
Packit 1470ea

La principale différence entre les deux implémentations principales de Gtk.TreeModel est que Gtk.ListStore ne contient que des lignes de données sans enfant, alors que Gtk.TreeStore contient aussi des lignes de données mais que chacune d'elle peut contenir des lignes enfants (qui à leur tour peuvent aussi contenir des lignes enfants et ainsi de suite).

Packit 1470ea
Packit 1470ea

Les données du modèle peuvent être supprimées ou modifiées avec l'itérateur arborescent et l'indexe de la colonne, ou avec Gtk.TreeIter, ou Gtk.TreePath.

Packit 1470ea
Packit 1470ea

Comme avec l'objet liste intégré dans Python, vous pouvez obtenir le nombre de lignes avec len() et utiliser des segments pour récupérer ou définir des valeurs. D'une autre façon, la méthode append() renvoie un exemple de Gtk.TreeIter qui pointe vers l'emplacement de la ligne qui vient d'être insérée. L'appel à la fonction get_iter() récupère aussi un Gtk.TreeIter.

Packit 1470ea
Packit 1470ea

Comme Gtk.ListStore n'a qu'un seul niveau, c-à-d. les nœuds n'ont aucun nœud enfant, un chemin est essentiellement représenté par l'index de la ligne à laquelle vous souhaitez accéder. En ce qui concerne Gtk.TreeStore, un chemin est représenté par une liste d'indexes ou une chaîne de caractères. La chaîne se présente sous la forme d'une liste de nombres séparés par une colonne. Chaque nombre se réfère au décalage à ce niveau. Donc, le chemin "0" se réfère au nœud racine et le chemin "2:4" se réfère au cinquième enfant du troisième nœud.

Packit 1470ea
Packit 1470ea

Méthodes utiles pour un Gtk.TreeModel :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode get_iter(chemin) renvoie un exemple de Gtk.TreeIter qui pointe vers le chemin. Ce chemin est soit une liste de nombres séparés par une colonne, soit un tuple. Par exemple, la chaîne de caractères "10:4:0" est équivalente au tuple (10, 4, 0), car tous deux créent un chemin de niveau 3 pointant vers le 11ème enfant du nœud racine, le 5ème enfant de cet 11ème enfant et le 1er enfant de ce 5ème enfant.

</item>
Packit 1470ea
  <item>

La méthode iter_next(TreeIter) renvoie un exemple de Gtk.TreeIter qui pointe vers le nœud TreeIter suivant situé au même niveau, ou vers None s'il n'y a rien derrière.

</item>
Packit 1470ea
  <item>

La méthode iter_has_child(TreeIter) renvoie la valeur vrai si TreeIter a des enfants, ou faux dans le cas contraire.

</item>
Packit 1470ea
  <item>

La méthode iter_children(TreeIter) renvoie un exemple de Gtk.TreeIter qui pointe vers le premier enfant de TreeIter, ou sur None si TreeIter n'a pas d'enfant.

</item>
Packit 1470ea
  <item>

La fonction get_iter_first() renvoie un exemple de Gtk.TreeIter qui pointe vers le premier itérateur arborescent (celui du chemin "0") ou sur None si l'arborescence est vide.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Méthodes utiles pour un Gtk.ListStore :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode append(ligne) ajoute une nouvelle ligne à ce magasin liste, où ligne peut être une liste de valeurs pour chaque colonne ; ligne peut aussi être omis ou avoir la valeur None et dans ces cas une colonne vide est ajoutée. La méthode renvoie un Gtk.TreeIter qui pointe vers la ligne ajoutée.

</item>
Packit 1470ea
  <item>

La méthode remove(iter) supprime l'iter du magasin Gtk.ListStore et renvoie la valeur vrai si l'itérateur est valide ou faux dans le cas contraire. Après sa suppression, l'iter est configuré pour devenir la prochaine ligne valide.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Méthodes utiles pour un Gtk.TreeStore :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode append(parent, ligne) ajoute une nouvelle ligne à ce magasin arborescent ; parent doit être un Gtk.TreeIter valide. Si la valeur du parent est différente de None, alors elle ajoute la nouvelle ligne après le dernier enfant du parent, sinon elle ajoute une ligne au premier niveau ; ligne peut être une liste de valeurs pour chaque colonne, ou alors peut être omis ou avoir la valeur None ; dans ce dernier cas, une colonne vide est ajoutée. La méthode renvoie un Gtk.TreeIter qui pointe vers la ligne ajoutée.

</item>
Packit 1470ea
  <item>

La méthode remove(iter) supprime l'iter du magasin Gtk.ListStore et renvoie la valeur vrai si l'itérateur est valide ou faux dans le cas contraire. Après sa suppression, l'iter est configuré pour devenir la prochaine ligne valide.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="treeview">
Packit 1470ea
<title>La Vue : le cas de la TreeView</title>
Packit 1470ea
Packit 1470ea

Une TreeView affiche la structure des éléments enfants et parents sous la forme des branches d'un arbre. Regardez cet <link xref="treeview_treestore.py">exemple</link>.

Packit 1470ea
Packit 1470ea

La Gtk.TreeViewColumn est utilisée pour organiser les colonnes verticales.

Packit 1470ea
Packit 1470ea

Méthodes utiles pour une vue Gtk.TreeView :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode set_model(modele) définit le modèle de cette vue arborescente. Si elle a déjà un modèle défini, la fonction le supprime avant de lui définir le nouveau. Si la valeur du modèle est None, la fonction supprime l'ancien modèle.

</item>
Packit 1470ea
  <item>

La méthode get_model() renvoie le modèle sur lequel est construite cette vue arborescente, ou None si le modèle n'est pas défini.

</item>
Packit 1470ea
  <item>

La méthode append_column(colonne) ajoute colonne à la liste de colonnes.

</item>
Packit 1470ea
  <item>

La méthode get_selection() récupère la sélection Gtk.TreeSelection associée à cette vue arborescente.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Méthodes utiles pour une Gtk.TreeViewColumn :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode add_attribute(renderer, attribut, valeur) ajoute un mappage d'attribut à cette colonne. attribut est le paramètre du renderer à définir à partir de la valeur valeur

</item>
Packit 1470ea
  <item>

La méthode pack_start(renderer, expand) compresse le renderer au début de cette colonne. Si la valeur d'expand est False, alors il est alloué au renderer juste l'espace qui lui est nécessaire. Tout espace inutilisé est divisé à parts égales entre les cellules pour lesquelles la valeur est True.

</item>
Packit 1470ea
  <item>

La méthode pack_end(renderer, expand) compresse le renderer à la fin de cette colonne. Si la valeur d'expand est False, alors il est alloué au renderer juste l'espace qui lui est nécessaire. Tout espace inutilisé est divisé à parts égales entre les cellules pour lesquelles la valeur est True.

</item>
Packit 1470ea
  <item>

set_sort_column_id(sort_column_id) sets the column of the model by which this column (of the view) should be sorted. This also makes the column header clickable.

</item>
Packit 1470ea
  <item>

La méthode set_sort_indicator(setting) définit s'il faut afficher une petite flèche dans l'en-tête de la colonne ; le setting possible peut être soit True (la flèche est visible), soit False.

</item>
Packit 1470ea
  <item>

La méthode set_sort_order(ordre) modifie l'ordre de tri de la colonne ; l'ordre peut être soit Gtk.SortType.ASCENDING, soit Gtk.SortType.DESCENDING.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="combobox">
Packit 1470ea
<title>La Vue : cas de l'élément graphique BoiteCombinee</title>
Packit 1470ea
Packit 1470ea

Une Gtk.ComboBox permet de sélectionner un élément à partir d'un menu déroulant, regardez <link xref="combobox.py">cet exemple</link>. Pour une liste de choix textuels, on peut aussi utiliser plus simplement un Gtk.ComboBoxText. Les deux peuvent contenir une entrée.

Packit 1470ea
Packit 1470ea

Méthodes utiles pour un élément graphique Gtk.ComboBox :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode statique new_with_entry() crée une nouvelle BoiteCombinee Gtk.ComboBox avec une entrée ; la méthode statique new_with_model(model) en crée une nouvelle à partir du modèle initialisé à model ; et la méthode statique new_with_model_and_entry(model) est une combinaison des deux autres.

</item>
Packit 1470ea
  <item>

La méthode get_active_iter() renvoie un Gtk.TreeIter qui pointe vers l'élément actif actuel. S'il n'y en a pas, elle renvoie None.

</item>
Packit 1470ea
  <item>

La méthode set_model(model) définit le modèle utilisé par la boîte combinée à model et annule le modèle précédent s'il existait déjà. Si la valeur model est None, alors la fonction annule le paramétrage du modèle. Notez que cette fonction ne supprime pas les générateurs de rendu de cellules.

</item>
Packit 1470ea
  <item>

La méthode set_entry_text_column(text_column) définit la colonne du modèle que cette boîte combinée doit utiliser pour que ses chaînes de caractères soient du type text_column. La colonne text_column dans ce modèle de boîte combinée doit être du type str (ceci n'est pertinent que si cette boîte combinée a été créée avec la propriété « has-entry » définie à True).

</item>
Packit 1470ea
  <item>

set_wrap_width(width) sets the wrap width of this combo box to be width. The wrap width is basically the preferred number of columns when you want the popup to be laid out in a grid.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea

Méthodes utiles pour une boîte Gtk.ComboBoxText :

Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode statique new_with_entry() crée une nouvelle Gtk.ComboBoxText vide avec une entrée.

</item>
Packit 1470ea
  <item>

La méthode append_text(texte) ajoute le texte à la liste des chaînes stockées dans cette boîte combinée.

</item>
Packit 1470ea
  <item>

La méthode get_active_text() renvoie la chaîne active actuelle de cette boîte combinée, ou None si aucune chaîne n'est sélectionnée. Si la boîte combinée contient une entrée, la méthode renvoie son contenu (qui n'est pas nécessairement un élément de la liste).

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="cellrenderer">
Packit 1470ea
<title>La Vue : les Cellrenderers</title>
Packit 1470ea
Packit 1470ea

La Vue se sert de Gtk.CellRenderer de différents types pour dessiner les données.

Packit 1470ea
Packit 1470ea

Implémentations de Gtk.CellRenderer et méthodes utiles :

Packit 1470ea
<list>
Packit 1470ea
  <item>

Gtk.CellRendererText - génère du texte dans une cellule

</item>
Packit 1470ea
  <item>

Gtk.CellRendererToggle - génère un bouton de basculement ou de radio dans une cellule. Méthodes utiles :

Packit 1470ea
    <list>
Packit 1470ea
    <item>

set_active(setting) - active ou désactive un générateur de rendu

</item>
Packit 1470ea
    <item>

get_active() - indique si le générateur de rendu est actif

</item>
Packit 1470ea
    <item>

set_radio(radio) - si la valeur radio est True, le générateur crée un bouton de radio inverseur (par ex. un inverseur d'un groupe mutuellement exclusif) ; si la valeur est False, il génère un inverseur de vérification (une option boléenne autonome)

</item>
Packit 1470ea
    <item>

get_radio() - indique si nous générons des boutons de basculement au lieu de cases à cocher.

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </item>
Packit 1470ea
  <item>

Gtk.CellRendererPixbuf - génère un rendu image dans une cellule

</item>
Packit 1470ea
  <item>

Gtk.CellRendererCombo - génère un rendu texte dans une cellule ; mais, alors que Gtk.CellRendererText n'offre qu'une simple entrée pour modifier le texte, Gtk.CellRendererCombo offre un élément graphique Gtk.ComboBox pour la même action. Il peut être utilisé avec ou sans un élément graphique Gtk.Entry associé, en fonction de la propriété de la valeur « has-entry ».

</item>
Packit 1470ea
  <item>

Gtk.CellRendererProgress - génère une valeur numérique sous forme de barre de progression dans une cellule ; il peut afficher du texte au-dessus de la barre de progression

</item>
Packit 1470ea
  <item>

Gtk.CellRendererSpinner - génère l'animation d'un indicateur dans une cellule

</item>
Packit 1470ea
  <item>

Gtk.CellRendererSpin - génère un bouton d'activité dans une cellule

</item>
Packit 1470ea
  <item>

Gtk.CellRendererAccel - génère un accélérateur de clavier dans une cellule

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="selection">
Packit 1470ea
<title>Le contrôleur : la sélection</title>
Packit 1470ea
Packit 1470ea

La plupart des applications doivent non seulement afficher des données, mais aussi réceptionner les événements émis par les utilisateurs. Pour faire cela, il faut tout simplement obtenir une référence pour un objet sélectionné et la connecter au signal « changed ».

Packit 1470ea
Packit 1470ea
Packit 1470ea
select = tree.get_selection()
Packit 1470ea
select.connect("changed", on_tree_selection_changed)
Packit 1470ea
Packit 1470ea
Packit 1470ea

Ensuite, pour récupérer les données pour la colonne sélectionnée :

Packit 1470ea
Packit 1470ea
Packit 1470ea
def on_tree_selection_changed(selection):
Packit 1470ea
    model, treeiter = selection.get_selected()
Packit 1470ea
    if treeiter != None:
Packit 1470ea
        print "You selected", model[treeiter][0]
Packit 1470ea
Packit 1470ea
Packit 1470ea

Useful methods for a Gtk.TreeSelection:

Packit 1470ea
Packit 1470ea
<list>
Packit 1470ea
  <item>

La méthode set_mode(type) définit le type de sélection, où type est l'un des

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Gtk.SelectionMode.NONE - pas de sélection possible

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.SINGLE - zéro ou un élément peut être sélectionné

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.BROWSE - exactement un élément est sélectionné. Dans certaines circonstances, comme au début ou pendant une opération de recherche, il est possible qu'il n'y ait aucun élément pouvant être sélectionné. Ce qui est réellement imposé, c'est l'impossibilité pour l'utilisateur de désélectionner un élément actuellement sélectionné sauf s'il en sélectionne un autre.

</item>
Packit 1470ea
    <item>

Gtk.SelectionMode.MULTIPLE -any number of elements may be selected. Clicks toggle the state of an item. The Ctrl key may be used to enlarge the selection, and Shift key to select between the focus and the child pointed to. Some widgets may also allow Click-drag to select a range of elements.

</item>
Packit 1470ea
  </list>
Packit 1470ea
  </item>
Packit 1470ea
  <item>

La méthode get_selected() renvoie un tuple (modele, TreeIter), où modele est le modèle actuel et TreeIter un Gtk.TreeIter qui pointe soit vers la ligne actuellement sélectionnée, soit vers None si aucune ligne n'est sélectionnée. La méthode ne marche pas si le type de sélection est défini à Gtk.SelectionMode.MULTIPLE ; dans ce cas, utilisez à la place la fonction get_selected_rows(), qui renvoie une liste d'exemples Gtk.TreePath de toutes les lignes sélectionnées.

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="references">
Packit 1470ea
<title>Références</title>
Packit 1470ea
Packit 1470ea
<list>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeModel.html">GtkTreeModel</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeView.html">GtkTreeView</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeViewColumn.html">GtkTreeViewColumn</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkComboBox.html">GtkComboBox</link>

</item>
Packit 1470ea
  <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkCellRenderer.html">GtkCellRenderer</link>

</item>
Packit 1470ea
</list>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>