BTS SIO SI4 – LES BASES DE LA PROGRAMMATION Python L’objectif de l’activité est de créer une application qui va se connecter à une base de données contenant des relevés météorologiques au format SQL grâce au moteur SQLite. Seuls, les utilisateurs préalablement authentifiés pourront utiliser l’application ; une boîte de dialogue permettra de s’identifier afin d’accéder à l’application et autoriser la connexion à la base. Lorsque la connexion est réalisée, vous pourrez choisir d’extraire certaines données et de les afficher sur la fenêtre principale, dans un tableau. Remarque : La bibliothèque standard de Python inclut un moteur de nommé SQLite. base de données relationnelles performant SQLite est le plus utilisé au monde. Il est notamment utilisé dans de nombreux logiciels grand public comme FireFox, Skype, Google Gears, dans certains produits d’Apple, d’Adobe et de McAfee et dans des bibliothèques standard de nombreux langages comme PHP ou Python. Il est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes. Il s’agit d’un produit entièrement gratuit et libre de droits. (Source : apprendre à programmer avec Python3 de Gérard Swinnen). SQLite mémorise toutes les tables d’une base de données dans un seul fichier multi-plate-forme. Le fichier que vous aurez à utiliser dans ce TP est « oregon.sq3 ». Attention a) Vous aurez à importer le module sqlite3 dans votre application! Vous pourrez mettre votre fichier « oregon.sq3 » où vous voulez sur le PC à condition de le spécifier dans le programme: Exemple : fichier = ‘’C:/python33/oregon.sq3’’ b) Il faut créer ensuite un objet-connexion à l’aide de la fonction connect() qui assurera l’interface entre le programme et la base de données. Exemple : connex = sqlite3.connect(fichier) c) On utilise ensuite un objet-curseur , tampon intermédiaire destiné à mémoriser temporairement les données en cours de traitement et les opérations effectuées avant le transfert définitif. Exemple : d) Le transfert dans la base s’effectue par : Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations cur = connex.cursor() connex.commit() 1 BTS SIO SI4 – LES BASES DE LA PROGRAMMATION Python Voici un exemple d’interface simple que vous pourrez arranger et améliorer par la suite. Il s’agit d’un MainWindow avec menu : - Créer un répertoire dans Python33 qui s’appelle « AppliMeteoSql ». Vous enregistrerez les fichiers de l’application à l‘intérieur. Ouvrir QtDesigner. Dans la fenêtre de dialogue, choisir MainWindow et cliquer sur créer. On obtient l’interface Qt avec une fenêtre vide. - Enregistrer le projet dans le répertoire créé précédemment sous le nom « FenetrePrincipale.ui ». - Modifier le titre de la fenêtre dans l’éditeur de propriétés sur la droite et trouvez la propriété « WindowTitle » de la classe Qwidget. Mettre « Application Météo ». Faire « Entrer ». Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations 2 BTS SIO - SI4 – LES BASES DE LA PROGRAMMATION Python L’étape suivante consiste à placer des widgets de sorte que l’on se retrouve avec cette fenêtre : Label Combo Box Group Box Table Widget Ajout des colonnes et noms : - Clic droit sur la fenêtre Table Widget et « Editer les éléments ». Largeur des colonnes: Dans l’éditeur de propriétés : - Onglet « Header », propriété « horizontalHeaderDefaultSectionSize » à diminuer. Ajout des lignes: Dans l’éditeur de propriétés : - onglet « QTableWidget » et propriété rowCount à 50. Ajout du menu déroulant (en haut à gauche) : - Double-cliquer sur le nom et noter « identification », puis sous-menu « Connexion Base ». Modification des noms de widgets : - Chaque widget doit avoir son propre nom pour mieux les utiliser dans votre programme Procéder à ces modifications. Enregistrer votre travail et fermer QtDesigner. N’oubliez pas d’éditer les « Combo Box » (mois, année, jour) Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations 3 BTS SIO SI4 – LES BASES DE LA PROGRAMMATION Python - Ce fichier doit maintenant être « converti » en langage Python. Nous allons créer un fichier nommé « ui_FenetrePrincipale.py » de la manière suivante : - Ouvrir la fenêtre de commande DOS (cmd). - Vérifiez avec la commande « DIR » que votre fichier « FenetrePrincipale.ui » s’ y trouve. Puis entrez la commande suivante : pyuic5 –o ui_FenetrePrincipale.py –x FenetrePrincipale.ui Faire « entrer » ; il ne doit pas y avoir de message particulier. Fermer la fenêtre. - L’étape suivante va consister à créer le programme principal indépendant de la partie programme de l’interface graphique (ceci est alors plus simple lorsqu’il faut changer des éléments de cette interface). Pour cela, créer un nouveau fichier « FenetrePrincipaleMain.py » puis insérer les lignes suivantes nécessaires pour afficher la fenêtre graphique. # --- importation des modules utiles --from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import os,sys Importer la classe graphique from ui_FenetrePrincipale import * # classe principale: Mettre le nom donné dans Qt designer class myApp(QMainWindow, Ui_FenetrePrincipale): def __init__(self, parent=None): QMainWindow.__init__(self) self.setupUi(parent) # fonction principale exécutant l'application Qt def main(args): a=QApplication(args) # crée l'objet application f=QMainWindow() c=myApp(f) # appelle la classe contenant le code de l'application f.show() # affiche la fenêtre QMainWindow Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations 4 BTS SIO SI4 – LES BASES DE LA PROGRAMMATION Python r=a.exec_() # lance l'exécution de l'application return r # pour rendre le fichier *.py exécutable if __name__=="__main__": # pour rendre le code exécutable main(sys.argv) # appelle la fonction main - Lancer l’exécution de ce programme (F5) et vérifier que l’interface apparaît sans erreur. Fermer le programme. La 2ème partie du travail va consister à compléter le programme principal pour se connecter à la base et afficher les données dans le tableau selon votre sélection. Pour cela, je vous propose de créer 2 méthodes : - executerRequete(self) qui sera appelée lorsque les combo Box de choix seront utilisés. - ecrireTable(self,don) qui sera appelée par la précédente méthode. On peut s’en passer mais cela permet de manipuler les méthodes. L’instruction qui permet de réagir à une action d’un combo Box est de la forme suivante : self.comboBox.currentIndexChanged.connect(self.executerRequete) « currentIndexChanged » est appelé le signal et la méthode « self.executerRequete() » est appelé le slot L’instruction qui permet de lire le contenu d’un Combo Box (un item) est de la forme suivante: self.comboBox.currentText() L’instruction qui permet d’effacer le contenu d’une table Widget est de la forme : self.tableWidget.clearContents() Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations 5 SI4 – LES BASES DE LA PROGRAMMATION Python BTS SIO Connexion à la base « oregon.sq3 » et à la table »oregon2 » et affichage : Le début du TP indique les instructions nécessaires à la connexion. Pour les données à récupérer, vous allez utiliser la méthode fetchall() qui permet d’obtenir une variable liste constituée de tuples (les tuples sont les enregistrements de la table). Exemple : self.cur.fetchall() [(2012, 2, 1, 0, 0, 0.9, 18.4, 73, 43, 1013), (2012, 2, 1, 0, 30, 2.2, 18.4, 81, 43, 1013), (2012, 2, 1, 1, 0, 2.4, 18.4, 87, 43, 1013), (2012, 2, 1, 1, 30, 1.6, 18.4, 76, 43, 1013)..........] est une variable contenant des tuples (enregistrements). Les données des tuples ne peuvent pas être modifiées par le programme (lecture seule). Pour parcourir l’ensemble des données de chaque tuple pour les répartir ensuite dans le tableau, on peut utiliser 2 boucles imbriquées dans la méthode « ecrireTable(self,don) »: i=0 for tup in don: #chaque tuple est parcouru indépendamment ind=0 for element in tup: #chaque variable du tuple parcouru est lu item = QtWidgets.QTableWidgetItem(str(element)) self.tableWidgetDonnees.setItem(i,ind,item) #et est placé au bon endroit dans le tableau ind+=1 i+=1 Remarque : ne pas hésiter à insérer des print() dans les boucles pour visualiser les variables ! La 3ème partie du travail va consister à créer la boîte de dialogue de connexion et de l’insérer dans le programme principal. On utilisera l’instruction : self.actionConnexion_Base.triggered.connect(self.connecter) Le signal est triggered et le slot est self.connecter(). self.groupBoxChoix.setEnabled(False) est l’instruction qui permet de « griser », donc de rendre inutilisable le contenu de GroupBoxChoix. A vous de continuer ! Lycée des Métiers Jacques Prévert Combs – la – Ville Section BTS Services Informatiques aux Organisations 6