Python - Llenar un QTableView con los registros de una tabla Sqlite

 
Vista:
Imágen de perfil de william

Llenar un QTableView con los registros de una tabla Sqlite

Publicado por william (4 intervenciones) el 25/09/2021 06:31:38
Hola. Estoy tratando de aprender este lenguaje y utilice el PyQt5 para diseñar un formulario o pantalla donde poder trabajar con los datos de una tabla de contactos. Mi consulta es que no sé como hacer para que al cargar este programa, el TableView se llene con los datos de la tabla que cree en Sqlite. Al menos creo que aprendiendo como hacer eso, creo poder hacer las funciones para cada uno de los botones que tengo ahi. En varios videos y paginas WEB he buscado como hacer eso pero en cada uno de esos recursos lo hacen de formas diferentes y la verdad estoy muy perdido con este tema. Yo vengo de programar en VisualFoxPro y ahi si que era demasiado fácil hacer esto y pensé que como Python es el lenguaje de mayor demanda estas cosas eran más fáciles de lograr, pero me he demorado muchisimo tiempo tratando de hacer esta parte gráfica y eso que descubrí el PyQt5 y el diseñador que me alegro la vida por un momento y al menos ya puedo adelantar esa parte de creación de formularios o pantallas. Intenté hacerlas con Tkinter pero jamas logré poner las cosas en las posiciones que quería. Y ademas hay que hacer todo manualmente, es decir, poniendo las columnas y las filas donde necesitaba poner los labels o los textbox. En ese sentido si es mucho mas practico FoxPro, pero como hay que actualizarnos pues toca aprender otras cosas.
Dejo lo que llevo de mi código python y me gustaria también recomendaciones de como aprender este lenguaje.

-------------------------
#Conexion a la BD
import sqlite3
try:
bd = sqlite3.connect("contactos.db")
cursor = bd.cursor()
sentencia = "SELECT * FROM contactos;"

cursor.execute(sentencia)

resultado = cursor.fetchall()

#print(resultado)
except sqlite3.OperationalError as error:
print("Error al abrir:", error)

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
#Fija el tamaño para que no se pueda ampliar o disminuir
MainWindow.setFixedSize(800, 600)

self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.frame1 = QtWidgets.QFrame(self.centralwidget)
#(pos-horizontal, pos-vertical, largo, alto)
self.frame1.setGeometry(QtCore.QRect(10, 40, 780, 75))
self.frame1.setAccessibleName("")
self.frame1.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame1.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame1.setObjectName("frame1")
self.pushButton = QtWidgets.QPushButton(self.frame1)
self.pushButton.setGeometry(QtCore.QRect(10, 20, 80, 26))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.frame1)
self.pushButton_2.setGeometry(QtCore.QRect(100, 20, 80, 26))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.frame1)
self.pushButton_3.setGeometry(QtCore.QRect(190, 20, 80, 26))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.frame1)
self.pushButton_4.setGeometry(QtCore.QRect(280, 20, 80, 26))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.frame1)
self.pushButton_5.setGeometry(QtCore.QRect(385, 20, 80, 26))
self.pushButton_5.setObjectName("pushButton_5")

self.label1 = QtWidgets.QLabel(self.centralwidget)
self.label1.setGeometry(QtCore.QRect(320, 10, 565, 16))
self.label1.setObjectName("label1")

self.tableView = QtWidgets.QTableView(self.centralwidget)
#(pos-horizontal, pos-vertical, largo, alto)
self.tableView.setGeometry(QtCore.QRect(40, 160, 720, 391))
self.tableView.setObjectName("tableView")

MainWindow.setCentralWidget(self.centralwidget)

self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)

self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)


self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Main-Window"))
self.pushButton.setText(_translate("MainWindow", "Nuevo"))
self.pushButton_2.setText(_translate("MainWindow", "Buscar"))
self.pushButton_3.setText(_translate("MainWindow", "Modificar"))
self.pushButton_4.setText(_translate("MainWindow", "Eliminar"))
self.pushButton_5.setText(_translate("MainWindow", "Salir"))
self.label1.setText(_translate("MainWindow", "Administrador de Contactos"))


if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())


-------- ESTE ES EL SCRIPT DE CREACION DE LA TABLA
CREATE TABLE "contactos" (
"Id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"PrimerNom" TEXT NOT NULL,
"SegundoNom" TEXT NOT NULL,
"PrimerApe" TEXT NOT NULL,
"SegundoApe" TEXT NOT NULL,
"Telefono1" TEXT,
"Empresa" TEXT,
"DirEmpresa" TEXT,
"TelEmpresa" TEXT,
"Etiqueta1" TEXT,
"Email" TEXT,
"Ciudad" TEXT,
"URL" TEXT,
"Notas" TEXT
)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Llenar un QTableView con los registros de una tabla Sqlite

Publicado por tincopasan (1082 intervenciones) el 25/09/2021 10:19:33
hay muchas formas de hacer lo que buscas y cada programador tiene su lógica o herramientas para hacerlo, en mi caso te diré:
1)no uso qtdesigner para crear los form salvo que los vaya a usar como archivos *.ui si es para convertirlos a *.py prefiero hacerlos a "mano" ya que para mi gusto en la transformación se agregan u omiten cosas que me interesan.
2)si bien cuando usas python en consola para el manejo de bases usas sqlite3 con pyqt no es necesario, trae de forma nativa un manejador de bases.
3) no tengo ganas de corregir o dejar funcional tú código, que dicho sea de paso, cuando vuelvas a pegar código usa el tag </>Codigo del editor, así se respeta las indentaciones y es más fácil de leer y ver si hay errores por la indentación.
4)es verdad que desarrollar forms arrastrando y soltando (drag and drop) es más rápido, pero no quiere decir mejor en el caso de python y pyqt, así que toca desarrollar manualmente.
5) no voy a crear la base y mucho menos hacer el código con cada elemento de la tabla, así que hago una versión minimalista de lo que buscás, te toca adaptaro a tus necesidades.
6) este código debería funcionar, pero como dije no lo voy a probar, así que lo hice al vuelo
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
#-*- coding: utf -8 -*-
 
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5.QtSql import *
import sys
 
class Principal(QMainWindow):
    def __init__(self):
        super().__init__()
        self.conectar = Conectar()
        self.apariencia()
 
    def apariencia(self):
        self.setWindowTitle('Agenda de Contactos')
        self.resize(677,700)
        self.setFont(QtGui.QFont("Sanserif", 12))
        self.table = QTableWidget(0, 6,self)
        self.table.setGeometry(QtCore.QRect(0, 0, 670, 570))
        self.table.setHorizontalHeaderLabels(['ID', 'Nombre', 'Apellido','Telefono','Ciudad','Mail'])
        self.table.setAlternatingRowColors(True)
        self.table.setEditTriggers(QTableWidget.NoEditTriggers)
        self.table.setSelectionBehavior(QTableWidget.SelectRows)
        self.table.setSelectionMode(QTableWidget.SingleSelection)
        self.btnejecutar = QPushButton('Mostrar',self)
        self.btnejecutar.setGeometry(QtCore.QRect(540, 590, 81, 31))
        self.btnejecutar.clicked.connect(self.consulta)
        self.show()
 
    def consulta(self):
        orden = 'Select * from contactos'
        index = 0
        query = QSqlQuery()
        query.exec_(orden)
        while query.next():
            numero = query.value(0)
            pri_nom = query.value(1)
            apellido = query.value(2)
            telefono = query.value(3)
            ciudad = query.value(4)
            mail = query.value(5)
            self.table.setRowCount(index + 1)
            self.table.setItem(index, 0, QTableWidgetItem(str(numero)))
            self.table.setItem( index,1, QTableWidgetItem(str(pri_nom)))
            self.table.setItem( index,2, QTableWidgetItem(str(apellido)))
            self.table.setItem(index, 3, QTableWidgetItem(str(telefono)))
            self.table.setItem(index, 4, QTableWidgetItem(str(ciudad)))
            self.table.setItem(index, 5, QTableWidgetItem(str(mail)))
            index += 1
 
class Conectar():
    def __init__(self):
        self.db = QSqlDatabase.addDatabase('QSQLITE')
        self.db.setDatabaseName('contactos.db')
 
        if not self.db.open():
            QMessageBox.critical(None,'Error','No se pudo abrir la base',QMessageBox.Cancel)
 
if __name__=='__main__':
    app = QApplication(sys.argv)
    ventana = Principal()
    sys.exit(app.exec_())

7) En todo caso sino funciona algo con la base creada que usas, subila junto con el código y vemos donde está el error.
8) sobre como aprender, es como todo, leer, practicar, buscar consejos, leer, practicar, etc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar