IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

ComboBox dans une QTableWidget


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut ComboBox dans une QTableWidget
    Bonjour à tous,
    Je débute en python et je cherche depuis plusieurs jours à mettre une liste déroulante dans un tableau de donnée qui est reliè à une seconde table.

    Dans l'exemple ci-dessous, j'ai une table client qui a un id_pays qui fait référence à une table pays.

    Nom : combo1.jpg
Affichages : 507
Taille : 21,5 Ko

    Je souhaite avoir une liste déroulante avec le nom des pays et pouvoir les modifier avec la combobox pour chaque client :

    Nom : combo2.jpg
Affichages : 541
Taille : 35,7 Ko

    ci-dessous mon code exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    import sys
    from PyQt5 import (QtWidgets, QtCore, QtSql)
    from PyQt5.QtWidgets import QApplication, QComboBox, QMainWindow, QWidget
    import sqlite3
     
    class ComboBoxExample(QMainWindow):
        def __init__(self):
            super().__init__()
            self.conn = sqlite3.connect("database.db")
            cursor = self.conn.cursor()
     
            QWidget.__init__(self)
            self.setWindowTitle("client")
            self.setMinimumHeight(450)
            self.setMinimumWidth(700)
     
            # Tableau client
            cursor.execute("SELECT client.id, client.name, client.id_pays, pays.nom_pays, pays.nom_pays "
                           "FROM client INNER JOIN pays ON client.id_pays = pays.id")
     
            result = cursor.fetchall()
     
            # Liste des pays pour combobox
            cursor.execute("SELECT * FROM pays")
            self.values = [row[1] for row in cursor.fetchall()]
     
            # affichage Tableau Client
            self.tableau = QtWidgets.QTableWidget(self)
            self.tableau.setGeometry(20, 100, 550, 300)
     
            # définition du tableau Client
            self.tableau.setRowCount(len(result))
            self.tableau.setColumnCount(len(result[0]))
            self.tableau.setHorizontalHeaderLabels(["id client", "client", "id pays", "pays", "pays"])
     
            # Remplissage du tableau Client avec les données de la table
            for i, row in enumerate(result):
                for j, item in enumerate(row):
                    self.combo = QComboBox()
                    self.combo.addItems(self.values)
                    self.tableau.setCellWidget(i, 4, self.combo)
                    self.tableau.setItem(i, j, QtWidgets.QTableWidgetItem(str(item)))
     
     
            # Affichage du tableau dans la fenêtre
            self.tableau.show()
            self.tableau.resizeColumnsToContents()
            self.tableau.setColumnWidth(0, 100)
            self.tableau.setColumnWidth(1, 100)
            self.tableau.setColumnWidth(2, 100)
            self.tableau.setColumnWidth(3, 100)
            self.tableau.setColumnWidth(4, 100)
            self.tableau.resizeRowsToContents()
     
    app = QApplication(sys.argv)
    combo_box_example = ComboBoxExample()
    combo_box_example.show()
    sys.exit(app.exec_())

    Merci par avance pour votre aide
    Stéphane
    Images attachées Images attachées  

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    Ça se fait simplement avec setCellWidget(row, cool, widget).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            item = QWidget(attrs)
            self.setCellWidget(r, 2, item)
    tu remplaces QWidget(attrs) par le widget que tu veux insérer dans cette cellule.

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ça se fait simplement avec setCellWidget(row, cool, widget).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            item = QWidget(attrs)
            self.setCellWidget(r, 2, item)
    tu remplaces QWidget(attrs) par le widget que tu veux insérer dans cette cellule.
    Salut Vins,
    Merci pour ta réponse,
    En fait pour mettre la combobox pas de problème mais le plus compliqué est de lier les valeurs de la combobox a une autre table par un id, de faire afficher la valeur de la premiere table quand on ouvre la fenetre et de modifier les valeur par la combobox.

  4. #4
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,
    J'avance dans mon problème.
    Nom : Capture d’écran 2023-02-04 093154.jpg
Affichages : 448
Taille : 10,8 Ko

    Avec le code ci-dessous cela fonctionne mais que sur la dernière ligne !!
    si je modifie les lignes 1 , 2 ou 3 elles modifient la ligne 4.
    En fait l'idcli a toujours la valeur 4 :

    def on_combo_changed(self, idcli):

    J'ai l'impression qu'il prend la dernière valeur de ma boucle for.
    Je suis pas trés loin de la solution !!

    Merci par avance
    Stéphane

    Mon nouveau code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    import sqlite3
     
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(2)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
            print("pays=", pays)
     
            for row, client in enumerate(clients):
                idcli, nom, pays_id = client
                print(client)
                combo = QtWidgets.QComboBox()
                combo.addItems(self.pays.values())
                combo.setCurrentText(self.pays[pays_id])
                combo.currentIndexChanged.connect(lambda: self.on_combo_changed(idcli))
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, combo)
     
        def on_combo_changed(self, idcli):
            print("idcli =", idcli)
            combo = self.sender()
            pays_nom = combo.currentText()
            print("pays_nom =", pays_nom)
            pays_id = list(self.pays.keys())[list(self.pays.values()).index(pays_nom)]
            print("pays_id =", pays_id)
     
            self.cursor.execute("UPDATE client SET pays_id=? WHERE id=?", (pays_id, idcli))
            self.db.commit()
     
    if __name__ == "__main__":
        import sys
     
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Et si tu essayes comme ceci: combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x)) ?

    Personnellement j'aurais sous-classé la combobox.

  6. #6
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Et si tu essayes comme ceci: combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x)) ?

    Personnellement j'aurais sous-classé la combobox.
    en mettant combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x))il récupere l'index de la liste de la combo et pas l'index de la ligne de la table

  7. #7
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par guigolo Voir le message
    en mettant combo.currentIndexChanged.connect(lambda x=idcli: self.on_combo_changed(x))il récupere l'index de la liste de la combo et pas l'index de la ligne de la table
    Tu peux expliquer sous classer la combobox ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Ci dessous la base :
    Nom : Capture d’écran 2023-02-04 125935.jpg
Affichages : 430
Taille : 15,2 Ko

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            item = CountryCombo(idcli, self)
            self.setCellWidget(row, col, item)
     
        def on_country_selected(self, row, index):
            # row définit la ligne donc le client
            # index définit le pays choisit
            ...
     
     
    class CountryCombo(QComboBox):
        def __init__(self, row, parent):
            super().__init__(parent)
            self.row = row
            self.curentIndexChanged.connect(self._on_index_changed)
     
        def _on_index_changed(self, idx):
            self.parent().on_country_selected(self.row, idx)

  10. #10
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            item = CountryCombo(idcli, self)
            self.setCellWidget(row, col, item)
     
        def on_country_selected(self, row, index):
            # row définit la ligne donc le client
            # index définit le pays choisit
            ...
     
     
    class CountryCombo(QComboBox):
        def __init__(self, row, parent):
            super().__init__(parent)
            self.row = row
            self.curentIndexChanged.connect(self._on_index_changed)
     
        def _on_index_changed(self, idx):
            self.parent().on_country_selected(self.row, idx)
    OK merci je vais regarder mais cela me semble plus compliqué.
    tu as pas un exemple de code en entier pour mon problème ?

  11. #11
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            item = CountryCombo(idcli, self)
            self.setCellWidget(row, col, item)
     
        def on_country_selected(self, row, index):
            # row définit la ligne donc le client
            # index définit le pays choisit
            ...
     
     
    class CountryCombo(QComboBox):
        def __init__(self, row, parent):
            super().__init__(parent)
            self.row = row
            self.curentIndexChanged.connect(self._on_index_changed)
     
        def _on_index_changed(self, idx):
            self.parent().on_country_selected(self.row, idx)
    Je viens d'essayer de mettre dans mon code mais je n'y arrive pas.
    Je comprend pas la logique avec les bouts que tu as envoyé.
    Désolé de t'embétter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    from PyQt5 import QtCore, QtGui, QtWidgets
    import sqlite3
    from PyQt5.QtWidgets import QComboBox
     
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(3)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
            print("pays=", pays)
     
            for row, client in enumerate(clients):
                idcli, nom, pays_id = client
                print(client)
                CountryCombo = QtWidgets.QComboBox()
                CountryCombo.addItems(self.pays.values())
                CountryCombo.setCurrentText(self.pays[pays_id])
     
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, CountryCombo)
     
                item = CountryCombo(idcli, self)
                self.setCellWidget(row, col, item)
     
        def on_country_selected(self, row, index):
            print(row)
            # row définit la ligne donc le client
            # index définit le pays choisit
     
        class CountryCombo(QComboBox):
            def __init__(self, row, parent):
                super().__init__(parent)
                self.row = row
                self.curentIndexChanged.connect(self._on_index_changed)
     
            def _on_index_changed(self, idx):
                self.parent().on_country_selected(self.row, idx)
     
     
     
    if __name__ == "__main__":
        import sys
     
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())

  12. #12
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Tu ne dois pas mettre la classe de la combobox à l'intérieur de celle de la table.

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(3)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
            print("pays=", pays)
     
            for row, client in enumerate(clients):
                idcli, nom, pays_id = client
                print(client)
                item = CountryCombo(row, self)
                item.addItems(self.pays.values())
                item.setCurrentText(self.pays[pays_id])
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, item)
     
        def on_country_selected(self, row, index):
            print(row)
            # row définit la ligne donc le client
            # index définit le pays choisit
     
    class CountryCombo(QComboBox):
        def __init__(self, row, parent):
            super().__init__(parent)
            self.row = row
            self.curentIndexChanged.connect(self._on_index_changed)
     
        def _on_index_changed(self, idx):
            self.parent().on_country_selected(self.row, idx)

  13. #13
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Tu ne dois pas mettre la classe de la combobox à l'intérieur de celle de la table.

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(3)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
            print("pays=", pays)
     
            for row, client in enumerate(clients):
                idcli, nom, pays_id = client
                print(client)
                item = CountryCombo(row, self)
                item.addItems(self.pays.values())
                item.setCurrentText(self.pays[pays_id])
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, item)
     
        def on_country_selected(self, row, index):
            print(row)
            # row définit la ligne donc le client
            # index définit le pays choisit
     
    class CountryCombo(QComboBox):
        def __init__(self, row, parent):
            super().__init__(parent)
            self.row = row
            self.curentIndexChanged.connect(self._on_index_changed)
     
        def _on_index_changed(self, idx):
            self.parent().on_country_selected(self.row, idx)
    OK
    Mais désolé je n'y arrive pas
    Tu as pas un exemple fonctionnel sur lequel je peux me baser ?
    Merci par avance
    Stéphane

  14. #14
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 195
    Points : 4 648
    Points
    4 648
    Par défaut
    bonjour
    Citation Envoyé par guigolo Voir le message
    Mais désolé je n'y arrive pas
    Tu as pas un exemple fonctionnel sur lequel je peux me baser ?
    Vu ce que tu as fait du code "exemple", c'est peine perdue ! Tu n'as pas les bases python, il est donc pratiquement impossible de s'attaquer tout de suite à ce framework (ou alors tu es un surdoué)
    On apprend python, puis une fois a l'aise, on passe aux frameworks

  15. #15
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 885
    Points : 7 233
    Points
    7 233
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Vu ce que tu as fait du code "exemple", c'est peine perdue ! Tu n'as pas les bases python, il est donc pratiquement impossible de s'attaquer tout de suite à ce framework (ou alors tu es un surdoué)
    On apprend python, puis une fois a l'aise, on passe aux frameworks
    Et encore... La POO ne serait pas un luxe !

  16. #16
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Vu ce que tu as fait du code "exemple", c'est peine perdue ! Tu n'as pas les bases python, il est donc pratiquement impossible de s'attaquer tout de suite à ce framework (ou alors tu es un surdoué)
    On apprend python, puis une fois a l'aise, on passe aux frameworks
    Bonjour,
    Merci pour les encouragement !
    Effectivement je débute en python !
    Je cherche justement à comprendre et pas faire un copier coller bêtement.
    Maintenant avec des bouts de codes c'est pas simple.

  17. #17
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Et encore... La POO ne serait pas un luxe !
    Merci également pour les encouragements !
    Je débute effectivement !

  18. #18
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Grand merci aux grand experts et à leur encouragements !!
    pour ceux qui le souhaite le code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    from PyQt5 import QtCore, QtGui, QtWidgets
    import sqlite3
    import functools
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.table = QtWidgets.QTableWidget(self)
            self.setCentralWidget(self.table)
     
            self.db = sqlite3.connect("database.db")
            self.cursor = self.db.cursor()
     
            self.cursor.execute("SELECT * FROM client")
            clients = self.cursor.fetchall()
            self.table.setRowCount(len(clients))
            self.table.setColumnCount(2)
     
            self.cursor.execute("SELECT * FROM pays")
            pays = self.cursor.fetchall()
            self.pays = {pay[0]: pay[1] for pay in pays}
     
            for row, client in enumerate(clients):
                id, nom, pays_id = client
                combo = QtWidgets.QComboBox()
                combo.addItems(self.pays.values())
                combo.setCurrentText(self.pays[pays_id])
                combo.currentIndexChanged.connect(functools.partial(self.on_combo_changed, id))
                self.table.setCellWidget(row, 0, QtWidgets.QLabel(nom))
                self.table.setCellWidget(row, 1, combo)
     
        def on_combo_changed(self, id):
            combo = self.sender()
            pays_nom = combo.currentText()
            pays_id = list(self.pays.keys())[list(self.pays.values()).index(pays_nom)]
            self.cursor.execute("UPDATE client SET pays_id=? WHERE id=?", (pays_id, id))
            self.db.commit()
     
    if __name__ == "__main__":
        import sys
     
        app = QtWidgets.QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec_())
    Merci à Vins pour son aide et sa patience
    Et merci à Chat GPT
    Bonne soirée

  19. #19
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 474
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Je suis d'accord avec les réponses ci-dessus, et en particulier le fait qu'une programmation graphique a peu de chance de réussir sans une bonne maîtrise des bases de Python, y compris, bien sûr, de la POO couramment utilisée dans cette programmation.

    Je voulais juste ajouter un complément qui n'a pas été cité. Quand on veut afficher la table d'une base de données, il vaut mieux utiliser un QTableView plutôt qu'un QTableWidget. En effet, le QTableView peut être lié automatiquement à la base de données avec un "modèle" comme un QSqlRelationalTableModel. Ainsi, l'affichage est automatique (le remplissage des cases se fait tout seul), et la mise à jour de la base de données en fonction des modifications du QTableView se fait aussi automatiquement (à la sortie de l'édition, ou après un clic sur un bouton).

    Il y a d'autres avantages, par exemple, permettre l'affichage et la mise à jour des données avec des widgets différents (combobox, QSpinbox, QDoubleSpinbox, widget perso, etc...) avec un QSqlRelationalDelegate, y compris avec des données ayant des contraintes d'intégrité (telles que définies à la conception des tables).

    On peut aussi ajouter des capacités puissantes de tri et de filtrage des données avec un QSortFilterProxyModel qui s'interpose entre le modèle et le QTableView. On peut, par exemple, faire des recherches multicritères, non seulement avec des motifs wildcard, mais aussi avec des regex. On peut même utiliser des recherches par "mots similaires", comme je l'ai déjà fait pour tenir compte des fautes de frappe (voir: SequenceMatcher du module difflib).

    Pour faire ça avec sqlite3, on ne peut plus utiliser le module de Python, mais celui fourni avec PyQt (QtSql) et les pilotes fournis. Ce qui n'empêche pas que d'autres opérations de traitement soient faites avec le module de Python, à condition que ce ne soit pas en même temps.

    Bref, avec PyQt, on arrive à faire des applications très performantes de gestion graphique de bases de données sqlite3, postgres, odbc (...). Et comme on utilise les modules de Qt5 écrits en C++, c'est en plus très rapide.

  20. #20
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour

    Je suis d'accord avec les réponses ci-dessus, et en particulier le fait qu'une programmation graphique a peu de chance de réussir sans une bonne maîtrise des bases de Python, y compris, bien sûr, de la POO couramment utilisée dans cette programmation.

    Je voulais juste ajouter un complément qui n'a pas été cité. Quand on veut afficher la table d'une base de données, il vaut mieux utiliser un QTableView plutôt qu'un QTableWidget. En effet, le QTableView peut être lié automatiquement à la base de données avec un "modèle" comme un QSqlRelationalTableModel. Ainsi, l'affichage est automatique (le remplissage des cases se fait tout seul), et la mise à jour de la base de données en fonction des modifications du QTableView se fait aussi automatiquement (à la sortie de l'édition, ou après un clic sur un bouton).

    Il y a d'autres avantages, par exemple, permettre l'affichage et la mise à jour des données avec des widgets différents (combobox, QSpinbox, QDoubleSpinbox, widget perso, etc...) avec un QSqlRelationalDelegate, y compris avec des données ayant des contraintes d'intégrité (telles que définies à la conception des tables).

    On peut aussi ajouter des capacités puissantes de tri et de filtrage des données avec un QSortFilterProxyModel qui s'interpose entre le modèle et le QTableView. On peut, par exemple, faire des recherches multicritères, non seulement avec des motifs wildcard, mais aussi avec des regex. On peut même utiliser des recherches par "mots similaires", comme je l'ai déjà fait pour tenir compte des fautes de frappe (voir: SequenceMatcher du module difflib).

    Pour faire ça avec sqlite3, on ne peut plus utiliser le module de Python, mais celui fourni avec PyQt (QtSql) et les pilotes fournis. Ce qui n'empêche pas que d'autres opérations de traitement soient faites avec le module de Python, à condition que ce ne soit pas en même temps.

    Bref, avec PyQt, on arrive à faire des applications très performantes de gestion graphique de bases de données sqlite3, postgres, odbc (...). Et comme on utilise les modules de Qt5 écrits en C++, c'est en plus très rapide.
    Bonjour Tyrtamos,
    Encore une fois je débute et les informations que tu me donne sont précieuses.
    je vais regarder du coté de QTableView qui me semble plus adapté et plus puissant effectivement.
    Un grand merci pour ton aide.
    Bon dimanche
    Stéphane

Discussions similaires

  1. Variable après un ComboBox dans une boucle FOR
    Par Dream Master dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/05/2007, 09h26
  2. Compiler informations de deux combobox dans une textbox
    Par thiephaine59000 dans le forum Général VBA
    Réponses: 1
    Dernier message: 14/05/2007, 17h58
  3. Combobox dans une Toolbar
    Par dug dans le forum wxWidgets
    Réponses: 2
    Dernier message: 27/03/2007, 15h15
  4. il est possible d avoir un combobox dans une MSFlexgrid ?
    Par leo13 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 09/01/2007, 22h03
  5. [DEBUTANT] Insérer une combobox dans une jTable
    Par Geolem dans le forum Composants
    Réponses: 2
    Dernier message: 25/11/2006, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo