Créer ma première application
L'utilisation de la bibliothèque WinLib rend très simple la création d'une application fenêtrée. Evidemment, dans cet exemple l'application ne fait rien du tout. Mais tout l'environnement de fonctionnement dans le modèle Open/Save est prêt à l'emploi, y compris les menus.
De ce fait, le développement d'une application se résume à dériver la classe Application de base et à surcharger quelques méthodes. La seule instanciation de la classe de base Application affiche ceci :
Instaciation de la classe Application
Voici l'exemple de code Python :
# -*- coding: utf-8 -*-
import sys
sys.path.append('./WinLib')
from WinLib.Application import *
myApp = Application(localization='fr')
Explications :
- La première ligne est une convention Python qui indique que le code du programme est encodé dans le standard UTF-8. Le fait de tout encoder en UTF-8 permet d'éviter les problèmes d'affichage des caractères accentués.
- Ensuite il confient de procéder aux importations des modules Python adéquats.Les modules WinLib se trouve dans le répertoire .\WinLib. Ce répertoire doit être recopié à la racine du projet Python. Pour que le système d'importation fonctionne correctement, il faut ajouter ce répertoire dans le chemin de recherche de l'interpréteur.
- La classe de base Application se trouve dans le module Application.py.
- L'instanciation de l'application se fait par l'invocation du constructeur de la classe Application. Par défaut, la localisation est 'en'. C'est à dire que les libellés, icônes, etc. sont définis en langue anglaise. Mais la bibliothèque fournit également une localisation en langue française. Dans ce cas, le paramètre à passer est 'fr'.
Localisation de l'application
Une application fenêtrée comporte de nombreux éléments, comme les chaines de caractères, qui dépendent de la langue de l'utilisateur. Afin de faciliter la localisation d'une application
sans avoir à modifier tout le code, ces élements sont réunis dans un fichier au format JSON. Ce fichier doit se trouver à la racine du projet. en.json contient les élements pour la langue
anglaise, fr.json pour le français. Il convient de traduire et de maintenir ces fichiers pour chaque langue désirée.
Voir article sur la localisation article sur la localisation.
Les menus
En standard, la classe application propose trois menus conformes au modèle Open/Save.
D'autres menus peuvent être ajoutés via le fichier de localisation. Celui-ci est analysé pour créer automatiquement les commandes supplémentaires qu'exige l'application. Voir l'article sur la gestion des menus gestion des menus.
Le menu Fichier (File en anglais)
Le menu Fichier fournit les commandes de gestion du document.
- La commande Nouveau crée un nouveau document. Si le document en cours a été modifié, une boite de dialogue s'affiche pour proposer d'enregistrer le document avant de le supprimer pour le remplacer par le nouveau.
- La commande Ouvrir affiche une boite de dialogue pour choisir un fichier. Si le document en cours a été modifié, une boite de dialogue s'affiche pour proposer d'enregistrer le document avant de le supprimer pour le remplacer par celui qui va être ouvert.
- La commande Enregistrer enregistre le document en cours. Si celui-ci n'a pas encore de nom, la commande est propagée à la commande Enregistrer sous.
- La commande Enregistrer sous ouvre une boite de dialogue pour donner un nouveau nom au document et indiquer l'endroit où le document doit être enregistré.
- La commande Imprimer permet de lancer l'impression du document sur une imprimante.
- La commande Mise en page permet de formmaliser la manière dont le document doit être imprimé.
- La commande Quitter ferme la fenêtre et arrête l'application. Si le document en cours a été modifié depuis le dernier enregistrement, un boite de dialogue propose de l'enregistrer ou d'abandonner les modifications. Mais il est aussi possible d'arrêter le processus d'arrêt pour continuer à travailler sur le document.
Le menu Edition (Edit en anglais)
Le menu Edition fournit les commandes de gestion du contenu du document. Essenciellement, il s'agit des commandes du presse-papier.
- La commande Annuler annule une opération de modification du document.
- La commande Rétablir permet de rétalir une opération de modification précédemment annulée.
- La commande Couper supprime un élément du document pour le mettre dans le presse-papier.
- La commande Copier recopie un élément du document pour le mettre dans le presse-papier.
- La commande Coller recopie le contenu du presse-papier dans le document.
- La commande Supprimer supprime un élément du document.
- La commande Sélectionner tout rassemble tous les élements du document. Ceux-ci peuvent être alors rangés dans le presse-papier ou supprimés par l'une des autres commandes du menu.
Le menu Aide (Help en anglais)
Le menu Aide est un menu standard des applications fenêtrées. Au minnimum, il fournit la commande A propos de pour afficher la boite de dialogue des crédits de l'application.
Dériver la classe Application
Comme déjà indiqué dans l'introduction de cet article, le développement d'une application fenêtrée avec WinLib consiste à dériver la classe Application en surchargeant les méthodes adéquates pour
obtenir le fonctionnement souhaité.
Par défaut, il ne se passe rien dans la fenêtre de l'application, si ce n'est d'afficher les coordonnées du curseur de la souris dans la barre d'état en bas de la fenêtre. Et pour cause, celle-ci est une instance de la classe tk.Frame de TkInter. L'exercice, ici va consister à remplacer le widget tk.Frame par le widget ScrollView de WinLib.
Code de l'exercice
# -*- coding: utf-8 -*-
import sys
sys.path.append('./WinLib')
from WinLib.Application import * #1
from WinLib.ScrollView import * #2
class MyApplication(Application) : #3
def __init__(self, localization="fr") : #4
super().__init__(localization)
def createMainView(self, parent): #5
main = ScrollView(self, parent) #6
return main
myApp = MyApplication() #7
Explications
- La classe Application se trouve dans le module Application de WinLib.
- La classe ScrollView se trouve dans le module ScrollView de WinLib.
- Il suffit de dériver la classe Application pour créer une nouvelle classe MyApplication.
- Le constructeur de la classe MyApplication se contente d'invoquer celui de la classe parente.
- La méthode createMainView est surchargée pour instancier une nouvelle fenêtre. Cette méthode doit fournir en résultat l'instance de cette fenêtre
- Instanciation d'une nouvelle fenêtre de classe ScrolView. Par défaut, celle-ci est dotée d'une zone de travail qui affiche un damier.
- Instanciation de la nouvelle classe MyApplication.
- bla
Il faut remarquer qu'il y a deux paramètres à passer dans le constructeur de la ScrollView. Le premier est l'instance de l'application propriétaire (ici self). Le second est le widget parent, c'est à dire celui qui va contenir la ScrollView (ici, l'instance de tk.Tk reçu en paramètre de la méthode createMainView).
# -*- coding: utf-8 -*-
import sys
sys.path.append('./WinLib')
from WinLib.Application import *
from WinLib.ScrollView import *
class MyApplication(Application) :
def __init__(self, localization="fr") :
super().__init__(localization)
def createMainView(self, parent):
main = ScrollView(self, parent)
return main
myApp = MyApplication()
Il est à remarquer que l'affichage des coordonnées de la souris dans la barre d'état ne fonctionne plus. C'est normal. Si on veut restaurer ce fonctionnement pour la nouvelle fenêtre,
une petite modification est nécessaire. Il suffit de lier la capture du déplacement de la souris à la zone de travail de la ScrollView. Cette liaison se fait selon le standard de gestion des événements de TkInter.
# -*- coding: utf-8 -*-
import sys
sys.path.append('./WinLib')
from WinLib.Application import *
from WinLib.ScrollView import *
class MyApplication(Application) :
def __init__(self, localization="fr") :
super().__init__(localization)
def createMainView(self, parent):
main = ScrollView(self, parent)
main.workArea.bind('<Motion>', self.__onMouseMove)
return main
def __onMouseMove(self, event):
statusItem = self.statusBar["position"]
statusItem.value = " {} x {} ".format(event.x, event.y)
statusItem = self.statusBar["position"]
statusItem.value = " {} x {} ".format(event.x, event.y)
myApp = MyApplication()
A ce niveau, une explication quant au fonctionement de la modification ci-dessus est délicate. Sauf à être familier avec le traitement des événements de TkInter.
De même sur la relation entre WoorkArea et ScrollView qui sera décrite en détail dans un article ultérieur.
Conclusion
Le developpement d'une application consiste à créer une classe dérivée de la classe Application et de surcharger les méthodes utiles pour personnaliser son fonctionnement.
Consulter la fiche de référence de la classe Application pour plus de détails sur les méthodes à surcharger.
L'article suivant traite de la localisation de l'application et des principes attachés.





Commentaires
Enregistrer un commentaire