Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Mostra consulta sqlite3 en QListWidget
#1
Hola hace poco volvi a  python despues de meses y retome mi proyecto de control de stock, pero quede trabado en una parte, ya consulte tutoriales y no encuentro el error y ni hablar de chat de IA saben menos que yo jaja entran en un bucle de errores... Tengo un ventana principal al hacer click en el boton AddProdButton_2 se abre una ventana nueva con entre otras cosas un QlistWidget llamado listWidget en el que quiero mostrar una consulta sqlite3, pero no logro hacerlo, puse un print al final del bucle for en la funcion SelecKits y los datos se imprimen correctamente si llamo al metodo show al final de la funcion se abre una  nueva ventana a parte de la que ya tengo creada  con solo el  QlistWidget con el contenido de la consulta como se muestra en la imagen
[Imagen: Corel.jpg]

paso el codigo a ver si alguien me da una idea de donde estoy cometiendo el error, la clase ( class KitWg ) con la funcion ( def SelectKits )de la ventana del listWidget esta al final del codigo, Gracias de antemano, abrazo...
Código:
import sys
import typing
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem, QListWidget, QTabWidget, QWidget, QListWidgetItem
from control.MainWindow import MainWindow
from control.KitsWindow import AddKitForm
from coneccion import Comunicacion
import sqlite3
#from creaKits import CreateKitsWidget
from control.KitsWindow import AddKitForm
class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        self.ui = MainWindow()
        self.ui.setupUi(self)
        self.BaseDatos = Comunicacion()
        self.BaseDatos.crear_tabla_productos()
        self.mostrar_tabla()
        self.selectArtLW = QListWidget()
        #self.SelectKits()
       
       

    #conectar botones a la funciones
        self.ui.AddProdButton.clicked.connect(self.AddArt)
        self.ui.AddProdButton.clicked.connect(self.mostrar_tabla)
        self.ui.dELProdButton.clicked.connect(self.del_prod)
        #self.ui.dELProdButton.clicked.connect(self.ClearLW)
        #self.ui.dELProdButton.clicked.connect(self.SelectKits)
        #self.ui.AddProdButton.clicked.connect(self.ClearLW)
        #self.ui.AddProdButton.clicked.connect(self.SelectKits)
       

       

    # Conecta la señal itemClicked del QTableWidget con la función que muestra los valores en los QLineEdit
        self.ui.tableWidget.itemClicked.connect(self.mostrar_item_seleccionado)

    # Conecta la señal editingFinished de los QLineEdit con la función para guardar los cambios
        self.ui.CodLE.editingFinished.connect(self.guardar_cambios)
        self.ui.ArtLE.editingFinished.connect(self.guardar_cambios)
        self.ui.CantLE.editingFinished.connect(self.guardar_cambios)
        self.ui.PrecioLE.editingFinished.connect(self.guardar_cambios)

    #conectar señal para mostrar kits a crear
        #self.ui.selectArtLW.itemSelectionChanged.connect(self.SeleccionKits)
        self.ui.AddProdButton_2.clicked.connect(self.abrir)
       
       
       
       
   

   
   



#Logica Tab Productos
    def AddArt(self):
      
        Codigo = self.ui.CodLE.text().strip()
        Articulo = self.ui.ArtLE.text().strip()
        Cantidad = self.ui.CantLE.text().strip()
        Talle = self.ui.TalleCB.currentText()
        Color = self.ui.ColorCB.currentText()
        Precio = self.ui.PrecioLE.text().strip()
        try:

            if Articulo:
                if Articulo.strip():
                    self.BaseDatos.inserta_producto(Codigo, Articulo, Cantidad, Talle, Color, Precio)
                   
                else:
                    print("el nombre del articulo no puese estar vacio")
            else:
                print("codigo o articulo invalidos")
        except sqlite3.Error as e:
            print("Error en la base de datos:", e)

   

    def del_prod(self):
        pass
        fila_seleccionada = self.ui.tableWidget.currentRow()
        if fila_seleccionada >= 0:
            id_valor = self.ui.tableWidget.item(fila_seleccionada, 0).text()  # Obtiene el ID de la fila seleccionada
            self.BaseDatos.eliminar(id_valor)  # Llama a la función de borrado con el ID
            self.mostrar_tabla()  # Actualiza la tabla después de borrar el registro
           
        else:
            print("No se ha seleccionado ninguna fila.")

   
     # Función para mostrar los valores del ítem seleccionado en los QLineEdit
    def mostrar_item_seleccionado(self, item):
        fila_seleccionada = item.row()
        id_valor = self.ui.tableWidget.item(fila_seleccionada, 0).text()
        cod_valor = self.ui.tableWidget.item(fila_seleccionada, 1).text()
        articulo_valor = self.ui.tableWidget.item(fila_seleccionada, 2).text()
        cant_valor = self.ui.tableWidget.item(fila_seleccionada, 3).text()
        precio_valor= self.ui.tableWidget.item(fila_seleccionada, 6).text()
       
       
        self.ui.CodLE.setText(cod_valor)
        self.ui.ArtLE.setText(articulo_valor)
        self.ui.CantLE.setText(cant_valor)
        self.ui.PrecioLE.setText(precio_valor)
   
# Función para guardar los cambios realizados en los QLineEdit
    def guardar_cambios(self):

        if self.ui.tableWidget.currentRow() >= 0:
            nuevo_codigo = self.ui.CodLE.text()
            nuevo_articulo = self.ui.ArtLE.text()
            nuevo_cantidad = self.ui.CantLE.text()
            nuevo_precio = self.ui.PrecioLE.text()

            if nuevo_codigo and nuevo_articulo and nuevo_cantidad and nuevo_precio:
                fila_seleccionada = self.ui.tableWidget.currentRow()
                id_valor = self.ui.tableWidget.item(fila_seleccionada, 0).text()
               

                if nuevo_articulo.strip():
                    self.BaseDatos.actualizar_articulo(id_valor, nuevo_codigo, nuevo_articulo, nuevo_cantidad, nuevo_precio)
                   
                else:
                    print("El nombre del artículo no puede estar en blanco")
            else:
                print("Código y/o artículo inválidos")
               
        else:
                print("No se ha seleccionado ninguna fila.")
        self.mostrar_tabla()
               
       
       
      
    def mostrar_tabla(self):
        resultado = self.BaseDatos.lectura_bd()
        i = len(resultado)
        self.ui.tableWidget.setRowCount(i)
        tablerow = 0
        for row in resultado:
            item0 = QTableWidgetItem(str(row[0]))  # str Convierte el Id a string
            item1 = QTableWidgetItem(str(row[1]))
            item2 = QTableWidgetItem(row[2])
            item3 = QTableWidgetItem(str(row[3]))
            item4 = QTableWidgetItem(row[4])
            item5 = QTableWidgetItem(row[5])
            item6 = QTableWidgetItem(str(row[6]))

            self.ui.tableWidget.setItem(tablerow, 0, item0)
            self.ui.tableWidget.setItem(tablerow, 1, item1)
            self.ui.tableWidget.setItem(tablerow, 2, item2)
            self.ui.tableWidget.setItem(tablerow, 3, item3)
            self.ui.tableWidget.setItem(tablerow, 4, item4)
            self.ui.tableWidget.setItem(tablerow, 5, item5)
            self.ui.tableWidget.setItem(tablerow, 6, item6)
            tablerow += 1
       
       
    def abrir(self):
        self.ventana = KitWg()
        self.ventana.show()
       

#Fin Logica Tab Productos

# #Logica ventana Crear Kits


class KitWg(QtWidgets.QMainWindow, AddKitForm):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        AddKitForm.__init__(self)
        self.setupUi(self)
        self.BaseDatos = Comunicacion()
        self.listWidget = QListWidget()
       
       
        self.ui = AddKitForm()
       


    def SelectKits(self):
        #self.listWidget.clear()
        DatosArt = self.BaseDatos.lectura_Art()
       
        #listWidget = QListWidget(self)
        # listWidget.addItem(['remeras'])
        # if DatosArt:
           

        for resultado in DatosArt:
           
               
            listWidgetItem = QListWidgetItem(resultado[0])  # Agrega el "Artículo" como un elemento de la lista
            self.listWidget.addItem(listWidgetItem)
            print(resultado[0])
        self.listWidget.show() #si agrego este metodo se abre una nueva ventana con el listwidget y el contenido de la consulta.


           
           

           
           


               
       
       
    # def ClearLW(self):
    #     self.ui.listWidget.clear()

    def show(self):
       super().show()
       self.SelectKits()

           






def main():
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
    db = Comunicacion()
Responder
#2
Buenas. ¿En qué momento estás creando la ventana nueva? Solo veo la ventana principal.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(25-09-2023, 12:00 AM)Francisco escribió: Buenas. ¿En qué momento estás creando la ventana nueva? Solo veo la ventana principal.

Hola Francisco gracias por responder, cuando preciono el boton Crear Kits
Código:
(self.ui.AddProdButton_2.clicked.connect(self.abrir)
 se ejecuta esta funcion: 
Código:
def abrir(self):
        self.ventana = KitWg()
        self.ventana.show()
y ahi se abre la ventana que tiene como titulo Kits, la que tiene entre otras cosas un boton largo que dice "AGREGAR KITS DE ARTICULOS"
perteneciente a la clase KitWg:
Código:
class KitWg(QtWidgets.QMainWindow, AddKitForm):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        AddKitForm.__init__(self)
        self.setupUi(self)
        self.BaseDatos = Comunicacion()
        self.listWidget = QListWidget()
       
       
        self.ui = AddKitForm()
       


    def SelectKits(self):
        #self.listWidget.clear()
        DatosArt = self.BaseDatos.lectura_Art()
       
        #listWidget = QListWidget(self)
        # listWidget.addItem(['remeras'])
        # if DatosArt:
           

        for resultado in DatosArt:
           
               
            listWidgetItem = QListWidgetItem(resultado[0])  # Agrega el "Artículo" como un elemento de la lista
            self.listWidget.addItem(listWidgetItem)
            print(resultado[0])
        self.listWidget.show() #si agrego este metodo se abre una nueva ventana con el listwidget y el contenido de la consulta.


           
           

           
           


               
       
       
    # def ClearLW(self):
    #     self.ui.listWidget.clear()

    def show(self):
       super().show()
       self.SelectKits()

           






def main():
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
    db = Comunicacion()
el problema es que en esa ventana que menciono deberia mostrarse la consulta a la base de datos pero queda en blanco, ahora si al final de la funcion SelectKits llamo a show: compruebo que la consulta se hace correctamente pero no donde yo queria.
Código:
self.listWidget.show()
se habre la ventana que en la imagen esta a la izquierda con el listwidget conteniendo la consulta a la base de datos, no se que estare haciendo mal comprobe los nombres de QlistWidget llamado listWidget, de las funciones y no veo nada rarro, algo me estoy olvidando porque no salta ningun error al correr el codigo
Responder
#4
Buenas. No deberías llamar al listWidget.show() porque ya estás mostrando el listWidget dentro de la ventana. ¿No te falta ubicar el listWidget en algún lugar de la ventana luego de crearlo? Algo así:

Código:
self.listWidget = QListWidget()
self.setGeometry(0, 0, 200, 500)

Luego de eso, con llamar a la función que llena los datos del listWidget sería suficiente:

Código:
self.listWidget = QListWidget()
self.setGeometry(0, 0, 200, 500)
self.SelectKits()
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
(26-09-2023, 10:18 PM)Francisco escribió: Buenas. No deberías llamar al listWidget.show() porque ya estás mostrando el listWidget dentro de la ventana. ¿No te falta ubicar el listWidget en algún lugar de la ventana luego de crearlo? Algo así:

Código:
self.listWidget = QListWidget()
self.setGeometry(0, 0, 200, 500)

Luego de eso, con llamar a la función que llena los datos del listWidget sería suficiente:

Código:
self.listWidget = QListWidget()
self.setGeometry(0, 0, 200, 500)
self.SelectKits()

Hola Francisco, el listWidgetshow() lo puse porque veia que si tiraba un print salia correcto solo fue para ver que pasaba y vi que se creo esa ventana, lo otro que me decis de ubicar el listWidget ya esta declarado en la clase que importo "from control.KitsWindow import AddKitForm" toda la interfaz fue creada en Qt designer y convertido el ui a py.
el listWidgetshow() no va a estar asi que esa ventana de la izquierda desaparece, el problema que no veo la falla por la cual no se muestra la consulta en mi ventana...
[Imagen: Corel-1.jpg]
Responder
#6
Entiendo. Entonces deberías usar el widget definido en AddKitForm en lugar de crear uno nuevo vía QListWidget(). Si en tu clase AddKitForm el widget se llama listWidget, basta con que borres esta línea:

Código:
self.listWidget = QListWidget()

Si no, además, tendrás que cambiar self.listWidget por el nombre correcto definido en tu KitsWindow.py.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#7
Que genio, era una pavada me quiero morir jaja le di vueltas por todos lados y ni hablar de chat gpt y bard, me confundieron mas, gracias nuevamente Francisco...
Responder
#8
¡Un placer! Big Grin
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)