1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 10 18:01:19 2019
etude_bdd_treview2.py
@author: gpoid
"""
import sys
from PyQt5 import (QtWidgets, QtCore, QtSql)
import mysql.connector
from mysql.connector import errorcode
DB_NAME = 'etude'
table = "matable"
#####################################################################
def ouvrebase(basesql):
"""ouvre la base et renvoie la connexion
si contrainte est True, active les contraintes de clé étrangère
en cas d'échec, retourne None"""
try:
cnx = mysql.connector.connect(host = '127.0.0.1',
database = DB_NAME,
user = 'guy',
password = ' ')
if cnx.is_connected():
print('Connecté MySql à la base')
return cnx
except mysql.connector.Error as err :
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("erreur nom utilisateur ,ou password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("la base n existe pas")
sys.exit()
#######################################################################
class VoirTableSql(QtWidgets.QMainWindow):
def __init__(self, basesql, nomtable, parent=None):
super().__init__(parent)
self.setWindowTitle("Affichage de la table %s" % (nomtable,))
self.resize(800, 600)
# ouvre la baseb SQL
self.basesql=DB_NAME
self.cnx=ouvrebase(basesql)
# table à afficher
self.nomtable = nomtable
# crée le modèle et sa liaison avec la base SQL ouverte
self.model = QtSql.QSqlRelationalTableModel(self,self.cnx )
# stratégie en cas de modification de données par l'utilisateur
self.model.setEditStrategy(QtSql.QSqlRelationalTableModel
.OnManualSubmit)
# crée la table graphique et son lien avec le modèle
self.vuetable = QtWidgets.QTableView(self)
self.vuetable.setModel(self.model)
# active le tri en cliquant sur les têtes de colonnes
#self.vuetable.setSortingEnabled(True)
# crée un bouton pour enregistrer les modifications dans la base
self.bouton1 = QtWidgets.QPushButton(
"Enregistrer les modifications", self)
self.bouton1.clicked.connect(self.appliquer)
# crée un bouton pour annuler les modifications non enregistrées
self.bouton2 = QtWidgets.QPushButton("Annuler les modifications",
self)
self.bouton2.clicked.connect(self.annuler)
# positionne les widgets dans la fenêtre QMainWindow
self.setCentralWidget(QtWidgets.QFrame())
posit = QtWidgets.QGridLayout()
posit.addWidget(self.bouton1, 0, 0)
posit.addWidget(self.bouton2, 0, 1)
posit.addWidget(self.vuetable, 1, 0, 1, 2)
self.centralWidget().setLayout(posit)
# affiche la table demandée
self.model.setTable(self.nomtable)
self.model.select() # peuple le modèle avec les données de la table
# met un delegate standard pour l'édition
self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(
self.vuetable))
# trie si nécessaire selon la colonne 0
self.model.sort(0, QtCore.Qt.AscendingOrder) # ou DescendingOrder
# ajuste hauteur lignes et largeur colonnes selon contenus
self.vuetable.resizeColumnsToContents()
self.vuetable.resizeRowsToContents()
#===================================================================
def appliquer(self):
"""Enregistre les modifications des données
* * * * """
if self.model.submitAll():
# ajuste hauteur lignes et largeur colonnes selon contenus
self.vuetable.resizeColumnsToContents()
self.vuetable.resizeRowsToContents()
# message ok
QtWidgets.QMessageBox.information(self,
"Enregistrement des modifications",
"Enregistrement terminé")
else:
# message erreur
QtWidgets.QMessageBox.warning(self,
"Enregistrement des modifications",
"Erreur: %s" % self.model.lastError().text())
#===================================================================
def annuler(self):
"""Annule les modifications des données faites avant enregistrement """
self.model.revertAll()
#===================================================================
def closeEvent(self, event=None):
"""Méthode appelée automatiquement à la fermeture de la fenêtre
* * * * """
# ferme la base
event.accept()
########################################################################
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
fen = VoirTableSql(DB_NAME, table)
fen.show()
sys.exit(app.exec_()) |
Partager