AviGNU - Mot-clé - PyGObjectGroupe d'utilisateurs de logiciels libres du Grand Avignon2024-01-02T17:40:01+01:00Administrateururn:md5:8ed776652564792dba453bac492a5a6cDotclearEnvie d'un diaporama comme fond d'écran ?urn:md5:723390ba7f405471733955dcbb2fe0b32018-08-18T14:24:00+02:002018-08-18T13:55:02+02:00Olivier DuchateauProgrammationGLibGObjectGSettingsPyGObjectPython3XML<p>Où comment faire défiler une série de fond d'écran pour les environnements de bureau tels que <a href="https://www.gnome.org/">GNOME</a>, <a href="https://mate-desktop.org/">MATE</a>, ou <a href="https://github.com/linuxmint/Cinnamon">Cinnamon</a>.</p> <p>Si vous utilisez un environnement de bureau dont les préférences sont gérées par <a href="https://developer.gnome.org/gio/stable/GSettings.html">GSettings</a>, j'ai la solution pour réaliser facilement cette tâche.</p>
<h3>Le principe</h3>
<p>Il nous faut :</p>
<ul>
<li>Un ensemble d'images (généralement la plupart des distributions proposent un paquet contenant des fonds d'écran)</li>
<li>Définir un temps d'affichage (il s'agit de la durée pendant laquelle le fond d'écran sera affiché)</li>
<li>Définir la durée de la transition entre deux fonds d'écran</li>
<li>Modifier la propriété adéquate</li>
</ul>
<p>Les trois premiers éléments de la liste ci-dessus doivent être stockés dans un fichier <abbr title="Extensible Markup Language">XML</abbr>, ce qui peut être fastidieux si l'on a un grand nombre d'images. Il faut répéter un certains nombres d'opérations, pouvant entraîner des erreurs, d'où l'idée d'automatiser le processus.</p>
<p>Je suis parti à la recherche d'un programme en Python (supportant Python3 et ne faisant pas appelle au module <a href="https://docs.python.org/3/library/subprocess.html">subprocess</a>). Je n'ai rien trouvé qui me satisfasse, j'ai donc décidé de créer le mien, <a href="https://bitbucket.org/olivierduchateau/backgrounds-slideshow">backgrounds-slideshow</a>.</p>
<h3>Comment il s'utilise ?</h3>
<p>On doit tout d'abord « cloner » le dépôt (on va récupérer les sources du programme <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2018/08/18/Envie-d-un-diaporama-comme-fond-d-%C3%A9cran#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>).</p>
<pre>
cd ~/Documents/
git clone https://bitbucket.org/olivierduchateau/backgrounds-slideshow.git
</pre>
<p>Un nouveau dossier <code>backgrounds-slideshow/</code> sera créer dans <code>~/Documents/</code>.</p>
<p>Il faut vérifier les dépendances. Le script utilise en grande partie les modules de la bibliothèque standard de Python. Cependant il nous faut également les <em>bindings</em> pour la bibliothèque <a href="https://developer.gnome.org/gobject/stable/">GObject</a> et notamment la partie <strong>instrospection</strong> à <a href="https://developer.gnome.org/glib/2.54/">GLib</a> (le paquet <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2018/08/18/Envie-d-un-diaporama-comme-fond-d-%C3%A9cran#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup> porte un nom différent suivant la distribution).</p>
<p>Quand tout est en place, on peut tester le programme. On va afficher les différentes options :</p>
<pre>
python3 backgrounds-slideshow -h
usage: backgrounds-slideshow.py [-h] [-e FILE] [-R] [-r] [-t MIN] directory
positional arguments:
directory directory to scan
optional arguments:
-h, --help show this help message and exit
-e FILE, --exclude FILE
file to exclude (can be specified multiple times)
-R, --recursive scan a directory recursively
-r, --random shuffle elements
-t MIN, --time MIN how long image is going to be displayed (default
15min)
</pre>
<h4>Un aperçu des différentes options</h4>
<p>On constate qu'il y a deux sortes d'options, facultatives (celles situées entre les crochets) et celles obligatoires.</p>
<p>Il faut obligatoirement spécifier le chemin vers un dossier contenant des images, par exemple :</p>
<pre>
python3 backgrounds-slideshow.py /usr/share/backgrounds/
</pre>
<p>Ci-dessus, il s'agit du cas le plus simple.</p>
<p>Par défaut le script s'arrête uniquement aux fichiers contenus dans le répertoire en question. Si il existe des sous-dossiers, ils ne sont pas traités, pour y remédier, il faut utiliser l'option <strong>-R</strong>.</p>
<pre>
python3 backgrounds-slideshow.py -R /usr/share/backgrounds/
</pre>
<p>Le programme ne comptabilise pas les liens symboliques, c'est pourquoi, il faut un minimum de <strong>deux fichiers</strong> (sinon un message d'erreur va s'afficher).</p>
<p>On peut vouloir exclure un (ou plusieurs) fichier(s), cela se fait à l'aide de l'option <strong>-e</strong>. Par exemple, si l'on ne souhaite pas voir s'afficher les images <code>symbolics-1.png</code> et <code>blue-dark.jpg</code> :</p>
<pre>
python3 backgrounds-slideshow.py -R -e symbolics-1.png -e blue-dark.jpg /usr/share/backgrounds/
</pre>
<p>Si tout se passe bien, un fichier XML sera créer dans le répertoire <code>~/.cache/</code>, et il a comme suffixe <strong>-slideshow.xml</strong>.</p>
<p>Le programme met à jour automatiquement la propriété correspondant à la valeur du fond d'écran, pour les bureaux qui sont supportés. Pour finir, une version <abbr title="Graphical User Interface">GUI</abbr> est en cours de développement.</p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2018/08/18/Envie-d-un-diaporama-comme-fond-d-%C3%A9cran#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Il est gérer par <a href="https://git-scm.com/">Git</a>, donc il faut l'installer au préalable.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2018/08/18/Envie-d-un-diaporama-comme-fond-d-%C3%A9cran#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] Consultez le fichier <code>README.rst</code> du dépôt.</p></div>
Aperçu du widget, GtkComboBoxurn:md5:8b61fedf749c7f122fea577b3ce2ba6f2013-08-12T13:59:00+02:002013-08-12T14:41:00+02:00Olivier DuchateauProgrammationGtkHowtoPyGObjectPython<p>Nous continuons notre série de billets consacrés aux principaux <em>widgets</em> sous <strong><a href="http://fr.wikipedia.org/wiki/GTK%2B">Gtk</a></strong>.</p>
<p>Cette fois-ci, il s'agit de <a href="https://developer.gnome.org/gtk3/stable/GtkComboBox.html">GtkComboBox</a>, cet élément permet de créer une liste déroulante.</p> <p>Dans le <a href="http://avignu.tuxfamily.org/index.php?post/2013/08/05/D%C3%A9couverte-du-widget-GtkEntry-avec-Python">précédent billet</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2013/08/12/Aper%C3%A7u-du-widget%2C-GtkComboBox#pnote-79-1" id="rev-pnote-79-1">1</a>]</sup> les différents éléments étaient placés dans une « <a href="https://developer.gnome.org/gtk3/stable/GtkGrid.html">grille</a> », je vais opté pour l'agencement dans une « <a href="https://developer.gnome.org/gtk3/stable/GtkBox.html">boîte</a> ».</p>
<p>Si l'on lit la description consacré à ce <em>widget</em>, on constate qu'il en existe un autre.</p>
<blockquote><p>[...]</p>
<p>
For a simple list of textual choices, the model-view API of GtkComboBox can be a bit overwhelming. In this case, <a href="https://developer.gnome.org/gtk3/stable/GtkComboBoxText.html">GtkComboBoxText</a> offers a simple alternative. [...]</p></blockquote>
<p>Nous allons donc commencé par celui-là.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-06.png" alt="Exemple 06 GtkComboBoxText" style="display:block; margin:0 auto;" title="Exemple 06 GtkComboBoxText" /></p>
<p>Il n'y a rien de particulèrement compliqué, on initialise <a href="https://developer.gnome.org/gtk3/stable/GtkComboBoxText.html">Gtk.ComboBoxText()</a>, auquel on ajoute des éléments grâce à la méthode <a href="https://developer.gnome.org/gtk3/stable/GtkComboBoxText.html#gtk-combo-box-text-append-text">append_text()</a> <sup>[<a href="http://avignu.tuxfamily.org/index.php?post/2013/08/12/Aper%C3%A7u-du-widget%2C-GtkComboBox#pnote-79-2" id="rev-pnote-79-2">2</a>]</sup>.</p>
<p>Pour récupérer un des éléments de la liste déroulante, il faut lui associé un signal, <a href="https://developer.gnome.org/gtk3/stable/GtkComboBox.html#GtkComboBox-changed">changed</a> dans notre cas.</p>
<p><em>La sélection affiche l'élément dans la console.</em></p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-06_b.png" alt="Affiche le résultat d'un des élément de GtkComboBoxText" style="display:block; margin:0 auto;" title="Affiche le résultat d'un des élément de GtkComboBoxText" /></p>
<p>Dans l'exemple suivant, on a simplement rajouter un bouton (<a href="https://developer.gnome.org/gtk3/stable/GtkButton.html">GtkButton</a>) associé au signal, <a href="https://developer.gnome.org/gtk3/stable/GtkButton.html#GtkButton-clicked">clicked</a>.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-07.png" alt="Exemple 07 GtkComboBoxText et GtkButton" style="display:block; margin:0 auto;" title="Exemple 07 GtkComboBoxText et GtkButton" /></p>
<p>Dans le troisième exemple, on va afficher une info-bulle (<a href="https://developer.gnome.org/gtk3/stable/GtkTooltip.html">GtkTooltip</a>) quand rien n'est sélectionné (et uniquement dans ce cas).</p>
<p>L'affichage du texte dans la console, se fait grâce à la fonction <a href="https://developer.gnome.org/gtk3/stable/GtkComboBoxText.html#gtk-combo-box-text-get-active-text">get_active_text()</a>. Elle renvoie <code>None</code> si rien n'est sélectionné, donc on peut jouer sur cette condition pour afficher ou non l'info-bulle.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-08.png" alt="Exemple 08 GtkComboBoxText, GtkButton et GtkTooltip" style="display:block; margin:0 auto;" title="Exemple 08 GtkComboBoxText, GtkButton et GtkTooltip" /></p>
<p>Voilà nous avons fait le tours de <a href="https://developer.gnome.org/gtk3/stable/GtkComboBoxText.html">GtkComboBoxText</a>, il nous reste à voir son « frère » <a href="https://developer.gnome.org/gtk3/stable/GtkComboBox.html">GtkComboBox</a>.</p>
<p>Dans un premier temps on doit définir un modèle <a href="https://developer.gnome.org/gtk3/stable/GtkListStore.html">GtkListStore</a>. Ensuite la liste déroulante est définie grâce à la fonction <a href="https://developer.gnome.org/gtk3/stable/GtkComboBox.html#gtk-combo-box-new-with-model">new_with_model()</a>. L'affichage de chaque élément se fait grâce à <a href="https://developer.gnome.org/gtk3/stable/GtkCellRendererText.html">GtkCellRendererText</a>.</p>
<p>Pour récupérer l'élément sélectionné, il faut utiliser la fonction <a href="https://developer.gnome.org/gtk3/stable/GtkComboBox.html#gtk-combo-box-get-active">get_active()</a>. Elle nous renvoie uniquement un numéro (celui de la ligne). Comme notre modèle « s'interface » avec <a href="https://developer.gnome.org/gtk3/stable/GtkTreeModel.html">GtkTreeModel</a>, on peut donc utiliser ces méthodes, en particulier <a href="https://developer.gnome.org/gtk3/stable/GtkTreeModel.html#gtk-tree-model-get-value">get_value()</a>.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-09.png" alt="Exemple 09 GtkComboBox et GtkButton" style="display:block; margin:0 auto;" title="Exemple 09 GtkComboBox et GtkButton" /></p>
<p>Dans notre dernier exemple, on affiche uniquement une info-bulle, quand rien n'est sélectionné.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-10.png" alt="Exemple 10 GtkComboBox, GtkButton et GtkTooltip" style="display:block; margin:0 auto;" title="Exemple 10 GtkComboBox, GtkButton et GtkTooltip" /></p>
<div class="footnotes"><h4 class="footnotes-title">Notes</h4>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2013/08/12/Aper%C3%A7u-du-widget%2C-GtkComboBox#rev-pnote-79-1" id="pnote-79-1">1</a>] Consacré à l'élément <a href="https://developer.gnome.org/gtk3/stable/GtkEntry.html">GtkEntry</a>.</p>
<p>[<a href="http://avignu.tuxfamily.org/index.php?post/2013/08/12/Aper%C3%A7u-du-widget%2C-GtkComboBox#rev-pnote-79-2" id="pnote-79-2">2</a>] C'est dans la fonction <code>create_rows()</code></p></div>
Découverte du widget GtkEntry avec Pythonurn:md5:42347de222bbb555e914d9c8ff9747882013-08-05T17:23:00+02:002013-08-05T16:33:47+02:00Olivier DuchateauProgrammationGtkHowtoPyGObjectPython<p>Dans ce billet nous allons découvrir le <em>widget</em>, <a href="https://developer.gnome.org/gtk3/stable/GtkEntry.html">GtkEntry</a>.</p>
<p>Cet élément graphique permet à un utilisateur de rentrer du texte (qui pourra, par la suite être traité).</p> <p>Notre premier exemple est très simple. Il s'agit d'afficher dans une « fenêtre mère » (<a href="https://developer.gnome.org/gtk3/stable/GtkWindow.html">GtkWindow</a>) un champ, dans lequel on peut y écrire (<em>Cf.</em> <code>entry-01.py</code>).</p>
<p>Si l'on valide en pressant la touche <strong>Entrée</strong>, le texte s'affiche dans la console.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-01.png" alt="Exemple 01 GtkEntry" style="display:block; margin:0 auto;" title="Exemple 01 GtkEntry" /></p>
<p>Pour l'exécuter, dans une console tapez simplement</p>
<pre>
olivier@chouffe:~ $ python entry-01.py
</pre>
<p>Dans l'exemple suivant, nous allons rajouté une nouvelle fonctionnalité, à savoir, permettre la possibilité de supprimer du texte précédemment entré.</p>
<p>Pour cela, on va utilisé la propriété <a href="https://developer.gnome.org/gtk3/stable/GtkEntry.html#GtkEntry--secondary-icon-stock">secondary-icon-stock</a> (affiche une icône) à laquelle on connecte un évènement <a href="https://developer.gnome.org/gtk3/stable/GtkEntry.html#GtkEntry-icon-press">icon-press</a> (<em>Cf.</em> <code>entry-02.py</code>).</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-02.png" alt="Exemple 02 GtkEntry" style="display:block; margin:0 auto;" title="Exemple 02 GtkEntry" /></p>
<p>Lorsque l'on clique sur l'icône située à gauche, le contenu du champ est supprimé.</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-02_b.png" alt="Exemple 02 GtkEntry vide" style="display:block; margin:0 auto;" title="Exemple 02 GtkEntry vide" /></p>
<p>Dans l'exemple suivant, nous allons rajouté un <a href="https://developer.gnome.org/gtk3/stable/GtkButton.html">bouton</a> (<strong>GtkButton</strong>) pour fermer la fenêtre. Il sera associé à l'évènement <a href="https://developer.gnome.org/gtk3/stable/GtkButton.html#GtkButton-clicked">clicked</a> (<em>Cf.</em> <code>entry-03.py</code>).</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-03.png" alt="Exemple 03 GtkEntry avec GtkButton" style="display:block; margin:0 auto;" title="Exemple 03 GtkEntry avec GtkButton" /></p>
<p>Dans ce quatrième exemple, nous allons rajouter un <em>widget</em> (<a href="https://developer.gnome.org/gtk3/stable/GtkLabel.html">GtkLabel</a>) devant le formulaire (<em>Cf.</em> <code>entry-04.py</code>).</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-04.png" alt="Exemple 04 GtkEntry avec GtkButton et GtkLabel" style="display:block; margin:0 auto;" title="Exemple 04 GtkEntry avec GtkButton et GtkLabel" /></p>
<p>Dans notre exemple le contenut du <em>label</em> est aligné à gauche, mais on peut en choisir un autre parmi la <a href="https://developer.gnome.org/gtk3/stable/gtk3-Standard-Enumerations.html#GtkJustification">liste</a> :</p>
<ul>
<li><code>Gtk.Justification.LEFT</code></li>
<li><code>Gtk.Justification.RIGHT</code></li>
<li><code>Gtk.Justification.CENTER</code></li>
<li><code>Gtk.Justification.FILL</code></li>
</ul>
<p>En plus de jouer sur l'alignement du text, on peut également lui appliquer un style. Il faut pour cela utiliser la bibliothèque <a href="https://developer.gnome.org/pango/stable/PangoMarkupFormat.html">Pango</a> (<em>Cf.</em> <code>entry-04_b.py</code>).</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-04_b.png" alt="Exemple 04 GtkEntry avec GtkButton, GtkLabel et Pango markup" style="display:block; margin:0 auto;" title="Exemple 04 GtkEntry avec GtkButton, GtkLabel et Pango markup" /></p>
<p>Dans le dernier exemple, nous allons rajouter une info-bulle (<a href="https://developer.gnome.org/gtk3/stable/GtkTooltip.html">GtkTooltip</a>) au survole du pointeur de la souris dans le champ (<strong>GtkEntry</strong>) quand il n'y a aucun texte (<em>Cf.</em> <code>entry-05.py</code>).</p>
<p><img src="http://avignu.tuxfamily.org/news-custom/public/exemples-gtk/exemple-05.png" alt="Exemple 05 GtkEntry avec GtkTooltip" style="display:block; margin:0 auto;" title="Exemple 05 GtkEntry avec GtkTooltip" /></p>