Classe Application

Module :WinLib.Application
Héritée de :object
Version :1.0 - 2024
Classes dérivées :
Cette classe définit le fonctionnement de la fenêtre principale d'une application Window.
L'application peut être localisée en passant l'acronyme du langage souhaité à l'instanciation. Les paramètres de localisation sont fournis dans un fichier json. La bibliothèque WinLib fournit deux fichier de localisation qui embarquent les fonctionnalités de base : fr.json pour le français et en.json pour l'anglais. Mais il est possible d'ajouter et de traduire d'autres fichiers à volonté selon les langues souhaitées. Voir l'article sur la localisation pour la compréhension de la structure de ces fichiers.

Attributs d'instance

self.local

Cet attribut est le dictionnaire des données de localisation. Voir l'article sur la localisation pour l'usage.

self.root

Cet attribut est l'instance de la class tk.Tk du module TkInter utilisée par l'application. Elle constitue la racine de l'arobrescence des Widgets constitutifs de l'application.

self.menuBar

C'est l'instance de la classe tk.Menu relative au menu principal de la fenêtre de l'application. En principe, ce menu est chargé à partir du fichier de localisation. Mais il peut être modifié par programmation en utilisant les primitives de TkInter en surchargeant la méthode self.createTopMenu.

self.toolBar

C'est la barre d'outils affichée en haut de la fenêtre principale. Il s'agit d'une instance de la classe WinLib.ToolBar. Cette barre d'outils est composée de boutons. Par défaut, les boutons sont relatifs aux commandes des menus Fichier et Edition. Mais elle peut être modifiée en surchargeant la commande self.createToolBar.

self.statusBar

C'est la barre de status affichée en bas la la fenêtre principale. Il s'agit d'une instance de la classe WinLib.StatusBar. Cette barre de status est composée de zones d'affichage dérivées de la classe StatusItem. Elle fonctionne comme un dictionnaire. Par défaut, une zone est déjà installée pour aficher les coordonnées de la souris (indexée par la clef "position"). Elle peut être complétée et modifiée en surchargeant la commande self.createStatusBar.

self.mainView

C'est typiquement la fenêtre qui affiche le fonctionnement réel de l'application. Par défaut, c'est une instance de la classe tk.Frame qui est est affichée. Cette instance ne fait absolument rien. C'est au développeur de créer une classe dérivée pour son application et de l'instancier dans la méthode self.createMainView. :attribute mainView: Instance du Frame princpal de l'application.

self.resources

Cet attribut est un dictionnaire de toutes les images utilisées par l'application. Les images doivent être contenues dans un dossier nommé ./resources situé à la racine du projet Python. Elles sont chargée automatiquement dans le dictionnaire à l'initialisation de l'application. Des dossiers alternatifs ou supplémentaires peuvent être chargés en invoquant la méthode self.loadResources dans la methode self.__init__ de l'application.
Les images contenues dans le dictionnaire sont des instances de ImageTk.PhotoImage (classe du module Pillow de Python) pour être prêtes à l'emploi dans les paramètres image de TkInter.

Méthodes publiques

self.__init__(self, localization='en')

Par défaut, le construteur de la classe Application effectue les opérations suivantes :
  • Chargement du fichier de localisation ddont l'acronyme est passé en paramètre.
  • Instanciation de la classe tk.Tk de TkInter. Cette instance est accessible par l'attribut self.root.
  • Chargement du dictionnaire des ressources images à partir du répertoire ./resources. Les ressources images sont accessibles par l'attibut self.resources["fichier"], où fichier est le nom du fichier contenant l'image.
  • Initialisation des paramètres de la fenêtre principale à partir des données de localisation.
  • Instanciation des widgets qui composent la fenêtre principale.
  • Lancement de la boucle des événements par l'invocation de la méthode mainloop() de la classe tk.Tk.
Il n'y a qu'un seul paramètre :
Paramètre Type Signification Défaut
localization String Acronyme de la langue utilisée, 'fr' pour français, 'en' pour anglais, etc. 'en'

self.loadResources(pathname)

Cette méthode charge les ressources images dans le dictionnaire des ressources à partir du dossier passé en paramètre. Elle peut être invoquée dans le constructeur des classes dérivées pour charger des ressources supplémentaires ou alternatives à celle déjà chargée en standard. Son fonctionnement s'appuie sur le module Pillow de Python pour s'assurer sue les photos soient dans un format acceptable par TkInter.
Paramètre Type Signification Défaut
pathname String Chemin relatif à la racine du projet du répertoire dans lequel se trouvent les fichiers images.

def __init__(self, localization="fr"):
    super().__init__(localization)
    self.loadResources(self, './mesresources')

self.createTopMenu(self, root)

Cette méthode est invoquée par le constructeur de l'application pour créer le menu principal. En fonction des environnements, le menu principal de l'application est embarqué dans la fenêtre principale, commme c'est le cas sous Windows, ou apparait en haut de l'écran, comme c'est le cas pour Mac-OS.
En principe, il n'est pas nécesssaire de surcharger cette méthode dans les classes dérivées, car le menu principal de l'application est construit automatiquement à partir des données enregistrée dans le fichier de localisation par la méthode self.parseMenu().
Paramètre Type Signification Défaut
root tk.Tk Instance racine de la fenêtre principale de l'application.
retour tk.Menu Instance de la barre du menu principal.

self.parseMenu(self, menuBar, menudef)

Cette méthode est invoquée pour construire la structure d'un menu à partir de la définition JSON du menu. Cette méthode n'est utilisée que par la méthode self.createTopMenu() pour construire le menu principal de l'application à partir du fichier de localisation.
Paramètre Type Signification Défaut
menuBar Tk.Menu Instance de la classe tk.Menu dans laquelle les items doivent être créés.
menuDef Dictionnaire Dictionnaire des commandes du mene définies au format JSON.

self.createToolBar(self, parent)

Cette méthode est invoquée par le constructeur de l'application pour créer la barre d'outils située en haut de la fenêtre principale de l'application.
Cette méthode peut être surchargée pour y ajouter ou y remplacer des boutons. Les boutons doivent être des innstance le la classe WinLib.ToolBarItem. La méthode doit renvoyer en résultat l'instance de la barre d'outil WinLib.ToolBar modifiée ou nouvellement créée.
Paramètre Type Signification Défaut
parent tk.Tk Instance de la classe tk.Tk de la fenêtre principale.
retour WinLib.ToolBar Instance de la barre d'outil créée ou modifiée.

def createToolBar(self, parent):
    bar = super().createToolBar(parent)
    BarSeparator(bar)
    ToolBarItem(bar, self.resources['mon_outil.png'], command=self.mon_outil_action)
    return bar

self.createMainView(self, parent)

Cette méthode est invoquée par le constructeur de l'application pour instancier la fenêtre principale de l'application.
Cette méthode DOIT être surcharger pour implémenter effectivement les fonctionnalités de l'application. Son role est de créer une instance de la classe tk.Frame ou dérivée pour embarquer les interactions de l'utilisateur sur l'application. La méthode doit renvoyer cette instance en résultat.
Paramètre Type Signification Défaut
parent tk.Tk Instance de la classe tk.Tk de la racine de la fenêtre principale.
retour tk.Frame Instance de la fenêtre principale.

def createMainView(self, parent):
    view = tk.Frame(parent, bg='ivory', relief='sunken', border="2")
    view.bind("<Button-1>", self.on_mouse_down)
    view.bind("<Button1-Motion>", self.on_mouse_move)
    view.bind("<Button1-ButtonRelease>", self.on_mouse_up)
    return view

self.createStatusBar(self, parent)

Cette méthode est invoquée par le constructeur de l'application pour créer la barre de status qui se trouve en bas de la fenêtre principale.
Cette méthode peut être surcharger pour y ajouter ou remplaccer des zones d'information suplémentaires.
La barre de status est une instance de la classe WinLib.StatusBar. Elle fonctionne comme un dictionnaire où chaque zone d'information est indexée par une clef. Pour être enregistrée dans le dictionnaire, chaque zone, instance de la classe WinLib.StatusBarItem, doit être ajoutée par l'invocation de la méthode addBarItem() de la classe StatusBar. Si la clef passée en paramètre existe déjà, le nouvel item remplace l'ancien.
Paramètre Type Signification Défaut
parent tk.Tk Instance de la classe tk.Tk de la racine de la fenêtre principale.
retour tk.Frame Instance de la barre de status.

def createStatusBar(self, parent):
    bar = StatusBar(parent)
    bar.addBarItem('position', StatusBarItem(bar, text="Position: "))
    bar.addBarItem('taille', StatusBarItem(bar, image=self.resources['Size24.png']))
    return bar

self.createEmptyDocument(self)

Cette méthode est invoquée par la constructeur de l'application, ou lorsque l'utilisateur clique sur la commande Fichier/Nouveau.
Un document est un conteneur d'objets métier géré par l'application. Son contenu peut être enregistré dans un ficher selon le pattern Open/Save.

self.clearContent(self)

Cette méthode est invoquée chaque fois qu'un nouveau document vide est créé. Tous les widgets relatifs à l'affichage des objets métier doivent être supprimés.
Cette méthode doit être surchargée pour définir le mécanisme de suppréssion des widgets associés aux objets métier.

self.updateUI(self)

Cette méthode est invoquée chaque fois que le document a été modifié pour ajuster l'affichage des objets métier au contenu actualisé du document.
Cette méthode doit être surcharée pour afficher le contenu du document dans la fenêtre principale.

self.canCloseDocument(self)

Si le document a été modifié, une boite de dialogue est ouverte pour demander à l'utilisateur d'assumer de fermer le document sans l'enregistrer.
Cette méthode peut être invoquée pour savoir si le document peut être fermé. La méthode revoit True si le document peut être fermé, False sinon.

self.menu_file_new(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Nouveau. Il n'est pas nécessaire de la surchargée car le fonctionnement du modèle Open/Save est déjà implémenté dans la classe Application.

self.menu_file_open(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Ouvrir. Il n'est pas nécessaire de la surchargée car le fonctionnement du modèle Open/Save est déjà implémenté dans la classe Application.

self.menu_file_save(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Enregistrer. Il n'est pas nécessaire de la surchargée car le fonctionnement du modèle Open/Save est déjà implémenté dans la classe Application.

self.menu_file_save_as(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Enregistrer sous. Il n'est pas nécessaire de la surchargée car le fonctionnement du modèle Open/Save est déjà implémenté dans la classe Application.

self.menu_file_print(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Imprimer. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour définir le mécanisme d'impression du document métier qui dépend des données métier enregistrées dans le document.

self.menu_file_print_preview(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Fichier/Mise en page. Elle n'est pas implémenté par défaut dans la classe Application. Il faut donc la surcharger pour définir la vue de ce qui va être imprimé qui dépend des données métier enregistrées dans le document.

self.menu_application_exit(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande Fichier/Quitter. Il n'est pas nécessaire de la surcharger car le fonctionnement du modèle Open/Save est déjà implémenté dans la classe Application. Cette commande invoque la méthode canCloseDocument() pour éviter de quitter une application sans avoir enregistré le document auparavant.

self.menu_edit_undo(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Annuler. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique Annuler/Rétablir est assez complexe à implémenter et dépend, d'une part des données métier gérées dans le document, et d'autre part des opérations possibles sur ces données pour lesquelles il faut définir un modèle numérique empilable. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.menu_edit_redo(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Rétablir. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique Annuler/Rétablir est assez complexe à implémenter et dépend, d'une part des données métier gérées dans le document, et d'autre part des opérations possibles sur ces données pour lesquelles il faut définir un modèle numérique empilable. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.menu_edit_cut(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Couper. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique du presse-papier est assez complexe à implémenter et dépend des données métier gérées dans le document. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.menu_edit_copy(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Copier. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique du presse-papier est assez complexe à implémenter et dépend des données métier gérées dans le document. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.menu_edit_paste(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Coller. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique du presse-papier est assez complexe à implémenter et dépend des données métier gérées dans le document. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.enu_edit_delete(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Supprimer. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir. Son implémentation dépend des données gérées dans le document.

self.menu_edit_select_all(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Edition/Sélectionner tout. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir. Son implémentation dépend des données gérées dans le document.

self.menu_help(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Aide/Aide. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.
La mécanique d'aide dépend des opérations et de l'expérience utilisateur de l'appplication. Un article ultérieur décrira l'implémentation d'une telle mécanique.

self.menu_about(self, event=None)

Cette méthode est invoquée lorsque l'utilisateur clique la commande du menu Aide/A propos de. En principe, cette commande affiche la boite de dialogue qui expose les crédits de l'application. Elle n'est pas implémentée par défaut dans la classe Application. Il faut donc la surcharger pour la définir.

self.display_not_implemented_command(self)

Cette méthode déclenche l'affichage d'une boite d'alerte pour indiquer qu'une commande ou une fonctionnalité n'est pas encore implémentée. Elle est utilisée en interne par la classe application. Mais le développeur peut l'invoquer au cours du développement de l'application pour éviter un plantage lorsque une partie de l'application n'est pas encore terminée.
Le message affiché se trouve à la rubrique application/not_implemented_command dans le fichier de localisation.

self.displayExceptionMessageBox(self, caption, message, error, *args)

Cette méthode déclenche l'affichage d'une boite d'alerte. Elle peut être utilisée lorsque l'application lève une exception.
Le paramètre args est un tuple de valeurs qui peuvent être insérées dans le paramètre message.
Paramètre Type Signification Défaut
caption String Titre de la Message Box.
message String Message affiché dans la Message Box. Celui-ci doit comporter autant de champs {} qu'il y a de paramètre suppélentaires passés.
error Exception Exception levée dans une séquence try...except.
args tuple Liste de paramètres supplémentaires.

infos = self.local["operation1"]
try:
    #...
except Exception as err:
    self.displayExceptionMessageBox(infos["title"], infos["error_message"], err, param1, param2)

Commentaires

Posts les plus consultés de ce blog

Développer une application fenêtrée en langage Python.

Créer ma première application

Localisation de l'application