====== wxPython : Création de la fenêtre de l'application ====== ==== Importation du module ==== #!/usr/bin/python3 # -*- coding: iso-8859-1 -*- # verification de la disponibilite de wxPython try: import wx except ImportError: print("Le module wxPython est nécessaire pour cette application.") raise ==== Créer la classe ==== wx.Frame est la classe de base pour les fenêtres standards. La classe de l'application va hériter de cette classe mère WX.Frame. import wx # création de la classe de l'application class Fenetre(wx.Frame): * Ajout du constructeur import wx # création de la classe de l'application class Fenetre(wx.Frame): # le constructeur de la classe fenetre hérite de wx.Frame, # il faut appeler le constructeur de la classe mère wx.Frame en passant l'instance en paramètre : # super(wx.Frame, self).__init__(). def __init__(self, parent, id, title, pos, size) : super(wx.Frame, self).__init__(parent, id, title,pos, size) # ancienne manière de procéder # wx.Frame.__init__(self, parent, id, title,pos, size) Une interface graphique est une **hiérarchie d'objets** : * Un bouton peut être **contenu** dans un panneau qui est contenu dans un onglet qui est contenu dans une fenêtre, etc. * chaque élément de l'interface graphique (widget) possède un **parent** (le widget qui le contient, généralement). * donc chaque** constructeur a un paramètre parent**. La **référence** du parent est utile quand il faut **montrer/masquer** des groupes de widgets, les redessiner à l'écran ou tout simplement les détruire quand la fenêtre est fermée. Une bonne habitude consiste à mémoriser la référence du parent. Le paramètre **id** est un **identifiant** unique du widget. import wx # création de la classe de l'application class Fenetre(wx.Frame): def __init__(self, parent, id, title, pos, size) : super(wx.Frame, self).__init__(parent, id, title,pos, size) self.parent = parent ==== Définir les composants de l'interface ==== Pour plus de clarté dans le code, on peut mettre dans une fonction spécifique initialise() la création des widgets et appeler cette fonction dans le constructeur. import wx # création de la classe de l'application class Fenetre(wx.Frame): def __init__(self, parent, id, title, pos, size) : super(wx.Frame, self).__init__(parent, id, title,pos, size) self.parent = parent self.initialise() def initialise(self): # forcer l'apparition de la fenetre self.Show(True) ==== Création du programme principal qui va lancer la création de la fenêtre ==== * il faut **instancier** un objet wx.App() avant de créer des éléments graphiques. * il faut ensuite créer une **instance de la classe Fenetre** ; on ne précise pas de parent (None) car c'est le premier élément graphique que nous créons. * identifiant sera wx.ID_ANY pour laisser wxPython le définir, * on précise le titre la position et la dimension de la fenêtre. import wx # création de la classe de l'application class Fenetre(wx.Frame): def __init__(self, parent, id, title, pos, size) : super(wx.Frame, self).__init__(parent, id, title,pos, size) self.parent = parent self.initialise() def initialise(self): # forcer l'apparition de la fenetre self.Show(True) if __name__ == "__main__": app = wx.App() fenetre_1 = Fenetre(None,wx.ID_ANY,'Première application', (25,25), (400,100)) * création de la boucle d'événement sans fin qui va attendre les événements utilisateur (clic sur un bouton par exemple). C'est le principe de la **programmation événementielle**. import wx # création de la classe de l'application class Fenetre(wx.Frame): def __init__(self, parent, id, title, pos, size) : super(wx.Frame, self).__init__(parent, id, title,pos, size) self.parent = parent self.initialise() def initialise(self): # forcer l'apparition de la fenetre self.Show(True) if __name__ == "__main__": app = wx.App() fenetre_1 = Fenetre(None,wx.ID_ANY,'Première application', (25,25), (400,100)) app.MainLoop() Au lancement du programme on obtient une fenêtre vide : {{ :dev:python:wx_01.png |}} ===== Retour au menu Interface graphique avec wxPython ===== * [[dev:python:wxpython_00|Interface graphique avec WxPython]]