Vous êtes sur la page 1sur 11

Table sqlite3 dans QTableWidget, sqlite3,

PyQt5

J'ai créé un programme qui gère les tables dans une base de données. Maintenant, j'essaie de créer
une interface graphique, et je me suis dit que le plus simple serait de le faire avec Qt Designer, puis
de le convertir en python avec PyQt5. fait, je sais comment lier les fonctions aux boutons, mais je ne
sais pas des choses plus compliquées comme afficher des colonnes et des lignes de tableau dans un
Qtablewidget, supposons que j'ai la base de données ci-dessous:

import sqlite3

conn = sqlite3.connect('realscheduler.db')

c = conn.cursor()

c.execute('pragma foreign_keys = ON;')

conn.commit()

Avec une table nommée professeurs avec 6 colonnes, que dois-je faire pour afficher cette table, ses
colonnes et ses lignes sur le soufflet QtableWidget?

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'testui.ui'

# Created by: PyQt5 UI code generator 5.4.1

# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

def setupUi(self, MainWindow):

MainWindow.setObjectName("MainWindow")

MainWindow.resize(800, 600)

self.centralwidget = QtWidgets.QWidget(MainWindow)

self.centralwidget.setObjectName("centralwidget")

self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)

self.horizontalLayout.setObjectName("horizontalLayout")

self.verticalLayout = QtWidgets.QVBoxLayout()

self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)

self.tabWidget.setObjectName("tabWidget")

self.tab = QtWidgets.QWidget()

self.tab.setObjectName("tab")

self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)

self.verticalLayout_2.setObjectName("verticalLayout_2")

self.tableWidget = QtWidgets.QTableWidget(self.tab)

self.tableWidget.setObjectName("tableWidget")

self.tableWidget.setColumnCount(0)

self.tableWidget.setRowCount(0)

self.verticalLayout_2.addWidget(self.tableWidget)

self.tabWidget.addTab(self.tab, "")

self.tab_2 = QtWidgets.QWidget()

self.tab_2.setObjectName("tab_2")

self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_2)

self.horizontalLayout_2.setObjectName("horizontalLayout_2")

self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_2)

self.tableWidget_2.setObjectName("tableWidget_2")

self.tableWidget_2.setColumnCount(0)

self.tableWidget_2.setRowCount(0)

self.horizontalLayout_2.addWidget(self.tableWidget_2)

self.tabWidget.addTab(self.tab_2, "")

self.verticalLayout.addWidget(self.tabWidget)

self.horizontalLayout.addLayout(self.verticalLayout)

MainWindow.setCentralWidget(self.centralwidget)

self.menubar = QtWidgets.QMenuBar(MainWindow)

self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))

self.menubar.setObjectName("menubar")

MainWindow.setMenuBar(self.menubar)

self.statusbar = QtWidgets.QStatusBar(MainWindow)

self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)

self.tabWidget.setCurrentIndex(1)

QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):

_translate = QtCore.QCoreApplication.translate

MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))

self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab


2"))

Avant de répondre à cette question, je vous recommande vivement d'ouvrir votre fichier d'interface
utilisateur dans Qt Designer et de modifier vos noms d'objet de tableWidget_2et pushButtonvers
quelque chose de plus approprié si vous allez vous rendre fou.

Deuxièmement, PyQt fournit une API complète pour travailler avec des bases de données
appelées QtSql . Vous pouvez accéder à l’API comme ceci:

from PyQt5.QtSql import (QSqlDatabase, QSqlQuery) #and so on.

Rant sur. Je vais répondre à votre question maintenant.

Les QTableWidgets sont assez précaires pour travailler et nécessitent deux choses:

1. Un contre drapeau

2. Nombre de lignes

3. Nombre de colonnes

4. Données (évidemment)

Pour insérer des données dans la table, vous pouvez faire quelque chose comme ceci.

def add_values(self):

self.count = self.count + 1 # this is incrementing counter

self.tableWidget_2.insertRow(self.count)

self.tableWidget_2.setRowCount(self.count)

# these are the items in the database

item = [column1, column2, column3]

# here we are adding 3 columns from the db table to the tablewidget

for i in range(3):

self.tableWidget_2.setItem(self.count - 1, i, QTableWidgetItem(item[i]))
Toutefois, si vous souhaitez simplement charger les données dans QTableWidget, vous pouvez le
faire et l’appeler dans la configuration:

def load_initial_data(self):

# where c is the cursor

self.c.execute('''SELECT * FROM table ''')

rows = self.c.fetchall()

for row in rows:

inx = rows.index(row)

self.tableWidget_2.insertRow(inx)

# add more if there is more columns in the database.

self.tableWidget_2.setItem(inx, 0, QTableWidgetItem(row[1]))

self.tableWidget_2.setItem(inx, 1, QTableWidgetItem(row[2]))

self.tableWidget_2.setItem(inx, 2, QTableWidgetItem(row[3]))
Connexion à la base de données
Pour vous connecter à la base de données, nous pouvons utiliser
la fonction sqlite3.connecten passant le nom d'un fichier à ouvrir ou à
créer:

>>> importer sqlite3


>>> db = sqlite3.connect ('data / test.db')

Nous pouvons utiliser l’argument ": memory:" pour créer un DB temporaire


dans la RAM:

>>> importer sqlite3


>>> dbm = db = sqlite3.connect (': memory:')

Quand nous avons fini de travailler avec la base de données, nous devons
fermer la connexion:

>>> db.close ()
>>> dbm.close ()

Création d'une base de données avec la ligne


de commande SQLite - en dehors du shell
python
Une autre façon de créer une base de données consiste à utiliser l'outil de
ligne de commande sqlite3:
$ ls
$ sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Entrez ".help" pour les instructions
Entrez les instructions SQL terminées par un ";"
sqlite> .tables
sqlite> .exit
$ ls
test.db

La commande .tables donne une liste des tables de la base de


données test.db. Nous n'avons pas de tables
maintenant. La commande .exit termine la session interactive de l'outil de
ligne de commande sqlite3.

CREER LA TABLE
Pour utiliser la base de données, nous devons obtenir un objet curseur et
transmettre les instructions SQL à l’objet curseur pour
les exécuter . Ensuite, nous devrions engager les modifications.

Nous allons créer une table de livres avec les colonnes titre, auteur, prix et
année.

>>> curseur = db.cursor ()


>>> cursor.execute ('' 'livres CREATE TABLE (id INTEGER PRIMARY K
EY,
... titre TEXT, auteur TEXT, prix TEXT, année TEXT)
... '' ')
>>> db.commit ()
Notez que la fonction commit est invoquée sur l' objet db , pas sur
l' objet curseur .

DROP TABLE
Pour déposer une table:

>>> curseur = db.cursor ()


>>> cursor.execute ('' 'Livres DROP' '' ')
>>> db.commit ()

INSERT - Insertion de données dans la base de


données
Pour insérer des données, nous utilisons le curseur pour exécuter la
requête. Dans cet exemple, nous allons insérer deux livres dans la base de
données, leurs informations seront stockées dans des variables python.

>>> db.close ()
>>> importer sqlite3
>>> db = sqlite3.connect ('data / test.db')
>>> curseur = db.cursor ()
>>> cursor.execute ('' 'livres CREATE TABLE (id INTEGER PRIMARY K
EY,
... titre TEXT, auteur TEXT, prix TEXT, année TEXT)
... '' ')
>>> db.commit ()

>>> importer sqlite3


>>> db = sqlite3.connect ('data / test.db')
>>> curseur = db.cursor ()
>>> title1 = 'Apprendre le python'
>>> author1 = 'Mark Lutz'
>>> price1 = '$ 36.19'
>>> year1 = '6 juil 2013'
>>>
title2 = 'Deux scoops de Django: Bonnes pratiques pour Django 1.6
'
>>> author2 = 'Daniel Greenfeld'
>>> price2 = '34,68 $'
>>> year2 = '1 février 2014'

>>> cursor.execute ('' 'INSERT INTO livres (titre, auteur, prix,


année)
... VALEURS (?,?,?,?) '' ', (Titre1, auteur1, prix1, année1))

>>> cursor.execute ('' 'INSERT INTO livres (titre, auteur, prix,


année)
... VALEURS (?,?,?,?) '' ', (Titre2, auteur2, prix2, année2))

>>> db.commit ()

Note: Si nous avons besoin de valeurs provenant de variables Python, il est


recommandé d’utiliser le "?" espace réservé. N'utilisez jamais d'opérations
sur les chaînes ni de concaténation pour effectuer vos requêtes, car elles
sont très peu sécurisées.

Les valeurs des variables Python sont passées dans un tuple.

Si nous avons plus de livres à insérer, nous pouvons continuer. Mais cette
fois, nous procéderons autrement: en passant un dictionnaire en utilisant
l’ espace réservé ": keyname" :
>>> title3 = 'Livre de recettes Python'
>>> author3 = 'David Beazley'
>>> price3 = '30,29 $'
>>> year3 = '29 mai 2013'

>>> cursor.execute ('' 'INSERT INTO livres (titre, auteur, prix,


année)
... VALEURS (: titre,: auteur,: prix,: année) '' ',
... {'titre': titre3, 'auteur': auteur3, 'prix': prix3, 'année':
année3})
<Objet sqlite3.Cursor à 0x7f1d2717d650>
>>>
>>> db.commit ()

Si nous devons insérer plusieurs utilisateurs, nous pouvons


utiliser executemany et une liste avec les tuples :

>>> title4 = 'Le livre rapide Python'


>>> author4 = 'Naomi R. Ceder'
>>> price4 = '16,39 $'
>>> year4 = '15 janvier 2010'
>>>
>>> title5 = 'Test Python'
>>> author5 = 'David Sale'
>>> price5 = '38,20 $'
>>> year5 = '2 sep 2014'

>>> livres = [(title4, author4, price4, year4),


... (title5, author5, price5, year5)]
>>> cursor.executemany ('' 'INSERER DANS les livres (titre, auteu
r, prix, année) VALEURS (?,?,?,?)' '', livres)
>>> db.commit ()
ligne de commande sqlite3
Voyons ce que nous avons fait jusqu'à présent en utilisant le shell de
commande sqlite:

$ sqlite3 test.db
SQLite version 3.7.17 2013-05-20 00:56:22
Entrez ".help" pour les instructions
Entrez les instructions SQL terminées par un ";"

sqlite> .tables
livres

sqlite> SELECT * FROM livres;


1 | Learning Python | Mark Lutz | 36,19 $ | 6 juil. 2013
2 | Deux cuillères de Django: Bonnes pratiques pour Django 1.6 |
Daniel Greenfeld | $ 34.68 | 1 févr. 2014
3 | Livre de recettes Python | David Beazley | 30,29 $ | 29 mai 2
013
4 | Le livre rapide en python | Naomi R. Ceder | 16,39 $ | 15 jan
v. 2010
5 | Tests sur Python | Vente David | 38,20 $ | 2 sept. 2014

sqlite> .mode colonne


sqlite> .headers on
sqlite> SELECT * FROM livres;
id titre auteur prix année
---------- --------------- ---------- ---------- ----- ------
1 Apprentissage de Python Mark Lutz 36,19 $ 6 juillet 2013
2 Deux boules de D Daniel Gre $ 34.68 1 févr. 2014
3 livre de recettes en python David Beaz 30,29 $ le 29 mai 201
4 Le pytho rapide Naomi R. C $ 16.39 15 janvier 201
5 Python Testing David Sale 38,20 $ 2 septembre 2014
sqlite>

Notez que nous avons modifié la manière dont les données sont affichées
dans la console. Nous avons utilisé le mode colonne et activé les en-têtes.