Programmer une fenêtre de déconnexion en langage Python

Bonjour,

Il y a quelques semaines, j’avais récupéré sur internet une fenêtre de déconnexion fabriquée grâce à la bibliothèque Pygtk. Voici à quoi elle ressemblait :

Bitte ausw_007

Elle possédait toutes les fonctions (« Mise en veille », « Redémarrer », « Éteindre » etc…) mais son design triste comme un jour de pluie ne me satisfaisait point. L’honnêteté m’oblige même à vous dire que je trouvais ça vilain comme tout. Comme cela fait plusieurs mois que je n’ai pas programmé en Python, je me suis dit qu’instancier ma propre fenêtre de déconnexion serait peut-être un bon exercice. Ça me dégourdirait les neurones.

Ni une ni deux, j’ai ouvert mon éditeur de texte et hop! après plusieurs heures de labeur, j’ai obtenu quelque chose qui me contente :

Abmeldungsfenster_009

J’ai déposé le tout sur framagit : https://framagit.org/Ordinosor/logout-window

Le code est ici.

Le cahier des charges

Je m’étais donné trois objectifs :

  1. Détecter la langue du système, (la « locale » comme on dit) et afficher les textes en conséquence.
  2. Remplacer chaque icône par le texte correspondant à la fonction du bouton, à chaque fois que le curseur de la souris survole une des cinq icônes. Effectuer l’opération inverse à chaque fois que le curseur quitte une des cinq icônes.
  3. Centrer la fenêtre au milieu de l’écran.

Détecter la langue du système

  • Importation du module locale,
  • Lignes 62 à 96 :
self._locale = locale.setlocale(locale.LC_ALL, "")[0:2]
  • la variable self._locale stocke les deux premiers caractères de la langue détectée (‘en’, ‘fr’, ‘de’ etc…)
  • Ensuite, j’ai créé une liste de trois listes contenant les traductions des boutons en allemand, en anglais et en français. À l’aide d’une condition if-elif-else, c’est la langue détectée qui sera utilisée.
  • Si la variable self._locale stocke les initiales d’une autre langue (par exemple le patois vendéen), la fenêtre sera en anglais car c’est la langue que j’ai définie par défaut. Vous devez bien vous douter que je ne vais pas m’amuser à traduire cette application dans tous les idiômes de la Terre!

Remplacer chaque icône par le texte correspondant à la fonction du bouton au survol de la souris (et le contraire pour l’opération inverse)

  • Lignes 175 à 194 : J’ai lié les boutons aux événements <‘Enter’> et <‘Leave’>
  • Ligne 48 : J’ai reconfiguré le bouton survolé pour faire disparaitre l’image et la remplacer par le texte. C’est là que j’ai eu un petit problème:
event.widget.config(image="", text=self.button_name...)
  • Comme vous pouvez le constater, il a fallu d’abord que j’affecte une chaîne de caractères vide à l’option image avant de configurer l’option text sinon ça ne fonctionnait pas.

Centrer la fenêtre au milieu de l’écran

  • Lignes 105 à 116: Ça n’a pas été simple. J’ai déniché un bout de script qui fait le boulot mais j’avoue que j’ai du mal à comprendre la formule mathématique. On récupère les dimensions de l’écran  auxquelles on retranche les dimensions requises pour afficher le widget, le tout divisé par deux. J’ai traduit le commentaire en français pour celles et ceux que ça intéresse.

Conclusion

Je suis content de m’être replongé dans le langage Python. Il est clair que le code mérite d’être retravaillé pour le rendre plus concis mais malgré tout, le résultat me donne entière satisfaction, à tel point que depuis ce matin, je n’arrête pas d’éteindre et de rallumer mon ordinateur… Jour… Nuit… Jour… Nuit… Jour… Nuit…

 

#Python : classes et méthodes (partie 2) – mise en pratique

Pour une lecture plus agréable (page plus large), je vous invite à cliquer sur ce lien et à lire ce chapitre dans la rubrique consacrée au langage Python.

Nous allons confier à deux programmeurs en herbe, Briface et Jobriel, le soin de rédiger le code d’une petite application à caractère pédagogique. Elle consiste à faire apparaître des formes générées aléatoirement. Continuer à lire … « #Python : classes et méthodes (partie 2) – mise en pratique »

#Python : programmer une photothèque

Bonjour à tous,

Aujourd’hui, je vous propose une courte vidéo Youtube qui me permet de vous montrer à quoi ressemble mon programme Ma photothèque écrit en langage Python (Ai-je besoin de le préciser…).

Il permet de créer des albums photos. Voici le code :

//pastebin.com/embed_iframe/cJiyHY80

#Python : Créer une photothèque

Edit du 7 Novembre 2016

Voici le code du programme :

//pastebin.com/embed_iframe/cJiyHY80

Bonsoir,

Aujourd’hui, scoop! Il faisait un temps gris et pluvieux dans le Nord de l’Allemagne. Alors, plutôt que de m’adonner à une activité extérieure, je me suis courageusement replié sur mon siège de bureau. Et pour me changer les idées, je me suis dit:

Continuer à lire … « #Python : Créer une photothèque »

#Python : Ordinotes, mon logiciel « post-it »

Dans la logithèque, la bibliothèque de logiciels proposée par Ubuntu, les mini-programmes pour enregistrer de simples notes sont légion. Entre Xpad, Knotes, GNote et compagnie, j’aurais du trouver mon bonheur mais ce n’est pas le cas. Aucun ne répond à mes exigences qui ne sont pourtant pas très élevées.  Compte tenu du fait qu’on ne se lance pas dans la rédaction d’un  roman sur des post-its de 60 millimètres par 60, il me semble évident que ce type de logiciel doit être simple, rapide et doté de fonctionnalités minimales. Un post-it, ça sert à écrire des notes « à la volée ».

Je me suis efforcé de respecter ce cahier des charges et c’est ainsi qu’est né Ordinotes, mon logiciel « post-it » personnel.

Code : //pastebin.com/embed_iframe/9mE0uS6J

ordinotes

Première chose, il n’est pas carré mais rectangulaire, ce qui permet de rédiger de vraies phrases sans être obligé de faire un retour chariot après trois mots. L’en-tête se résume à un bouton Menu (☰), à la date (automatiquement mise à jour grâce à l’importation du module localtime) et à un champ d’entrée pour renseigner l’objet. Aussi longtemps que celui-ci est vide, il n’est pas possible de rédiger la note car l’éditeur de texte est verrouillé. J’utilise pour ce faire la méthode isspace(). Dès que l’objet est renseigné, l’éditeur obtient le focus. Il est possible de modifier la date car il s’agit non pas d’un widget Label mais d’un champ d’entrée.

Cliquons sur l’icône menu (☰) et découvrons ensemble ses fonctionnalités. Pour votre gouverne, sachez que ce genre d’icône s’appelle une icône hamburger.

ordinotes_2

Le menu est noir car je trouve tout simplement que le noir et le jaune sont deux couleurs qui se marient bien ensemble. Il est tout à fait possible de modifier le programme pour les remplacer par d’autres couleurs. Il est même possible de le proposer directement à l’utilisateur grâce au sous-module colorchooser. Ce n’est pas bien compliqué.

Cliquons sur « Ouvrir ». L’on voit clairement que j’ai déjà rédigé quatre notes. Il n’est donc pas étonnant de voir apparaître quatre boutons. Il vous suffit de cliquer sur le bouton de votre choix pour que la note se matérialise :

ordinotes_3

Vous pouvez bien évidemment ouvrir toutes les notes et visualiser ainsi toutes les tâches qu’il vous reste à accomplir. C’est un peu le principe des post-it. J’ai défini une variable de classe qui fait apparaître les notes en cascade, avec un décalage de 100 pixels en hauteur et en largeur.

Le code est ici :

//pastebin.com/embed_iframe/9mE0uS6J

Il me reste encore quelques fenêtres d’avertissement à rajouter, notamment lorsque l’utilisateur décide de supprimer tout ou partie de ses notes. C’est l’affaire d’un petit quart d’heure.

Ai-je besoin de préciser que vous êtes libres de recopier ce code, de l’utiliser et de le modifier comme bon vous semble?

#Python : rajouter un champ de recherche dans mon agenda-calendrier

Bonjour à tous,

Aujourd’hui, dans mon agenda-calendrier qui me comble de joie, j’ai instancié un champ de recherche couplé à un bouton représentant une loupe. Il m’a fallu plusieurs jours pour arriver à mes fins mais je dois reconnaître que je suis bien content car il s’agit d’une fonction fort utile au demeurant. Le code est ici:

//pastebin.com/embed_iframe/C0eZJk5u

Comme vous pouvez le voir dans le diaporama ci-dessous, j’ai entré le mot « Espéranto » dans le champ de recherche. Vous pouvez mettre des majuscules ou des minuscules si cela vous chante… Peu importe puisque de toute manière, grâce à la méthode lower() que j’utilise dans mon code, toutes les lettres sont transformées en minuscules.

Lorsque je lance la recherche, la fonction (ou plutôt la méthode) ouvre une fenêtre Toplevel et me retourne toutes les dates où apparaît l’occurrence recherchée. Elle me les retourne sous forme de boutons, c’est-à dire que si vous cliquez sur le bouton 17/09/2016 par exemple, cela provoque l’ouverture de la page correspondante. Regardez comme c’est beau :

Ce diaporama nécessite JavaScript.

Oui, mais keskispasse si par hasard l’occurrence n’est présente dans aucune des pages de l’agenda? Eh bien là encore, pas de panique! La méthode vous prévient en ouvrant une fenêtre Toplevel contenant un message idoine… Le fond est rouge pour bien vous faire comprendre que votre recherche n’a rien donné :

recherche4

#Python : créer une horloge à aiguilles (suite et fin)

Bonjour,

Il y a quelques jours, je vous avais dit que je m’étais lancé dans la programmation d’une horloge et que j’éprouvais des difficultés à amorcer son mécanisme.

Eh bien aujourd’hui, je suis heureux de vous annoncer que j’ai réussi à surmonter cet obstacle. Désormais, comme vous pouvez le constater dans la vidéo ci-dessous prise vers onze heures moins dix, les aiguilles se meuvent dans la direction du futur.

Voici le code:

//pastebin.com/embed_iframe/7ad91Vg8

Il me faudra encore un peu de temps pour expliquer en détails comment fonctionne la méthode move, notamment l’utilité des fonctions cosinus et sinus. Je me suis inspiré d’un bout de code que j’ai trouvé sur internet. En clair, j’ai pompé en partie les lignes 62 à 64 et depuis quelques jours, je me suis plongé dans un cours de trigonométrie. Je manipule les sinus, les cosinus, les hypoténuses etc… dans l’espoir de pouvoir vous fournir une explication détaillée de ces trois lignes obscures.

Pour ce qui est du déplacement proprement dit, j’utilise la récursivité (ligne 65) : La méthode move s’appelle elle-même toutes les mille millièmes de seconde, c’est-à-dire toutes les secondes (ligne 66).