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 et Sql


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 197
    Par défaut Combobox et Sql
    Salut,

    voilà mon problème...
    Je cherche à faire une interface basique pour parcourir quelques enregistrements d'une table sqlite.
    Quand j'appuie sur les boutons "suivant" et "precedent", les champs textes associés au champ de la table s'affichent correctement.
    (exemple de table : Nom, prénom et date naissance)
    Maintenant,à la place d'un champ texte 'Nom', je voudrais faire une combo reprenant tout les noms de la table.Et pouvoir selectionner un nom dans la combo egalement.
    Voici mon code actuel :
    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
     
    from pysqlite2 import dbapi2 as sqlite3
    import os
    import sys
    from PyQt4 import QtCore,QtGui,QtSql
    from untitled import Ui_MainWindow
     
    NOM,PRENOM,NAISSANCE = range(3)
     
    class fen(QtGui.QMainWindow,Ui_MainWindow):
     
    	FIRST, PREV, NEXT, LAST = range(4)
     
    	def __init__(self,parent=None):
    		super(fen, self).__init__(parent)
    		self.setupUi(self)		
    		self.model=QtSql.QSqlRelationalTableModel(self)
    		self.model.setTable("clients")
    		self.model.select()
    		self.mapper = QtGui.QDataWidgetMapper(self)
                   self.mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.ManualSubmit)
    		self.mapper.setModel(self.model)
    		self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self))	
    		self.mapper.addMapping(self.lineEdit_2, NOM)
    		self.mapper.addMapping(self.lineEdit_3, PRENOM)
    		self.mapper.addMapping(self.lineEdit_4, NAISSANCE)
    		self.mapper.toFirst()
    		self.connect(self.pushButton_first, QtCore.SIGNAL("clicked()"),
    		           lambda: self.saveRecord(fen.FIRST))
    		self.connect(self.pushButton_prev, QtCore.SIGNAL("clicked()"),
    		           lambda: self.saveRecord(fen.PREV))
    		self.connect(self.pushButton_next, QtCore.SIGNAL("clicked()"),
    		           lambda: self.saveRecord(fen.NEXT))
    		self.connect(self.pushButton_last, QtCore.SIGNAL("clicked()"),
    		           lambda: self.saveRecord(fen.LAST))
     
    	def saveRecord(self, where):
    	    row = self.mapper.currentIndex()
    	    self.mapper.submit()
    	    if where == fen.FIRST:
    	        row = 0
    	    elif where == fen.PREV:
    	        row = 0 if row <= 1 else row - 1
    	    elif where == fen.NEXT:
    	        row += 1
    	        if row >= self.model.rowCount():
    	            row = self.model.rowCount() - 1
    	    elif where == fen.LAST:
    	        row = self.model.rowCount() - 1
    	    self.mapper.setCurrentIndex(row)
    Comment feriez-vous?

    j'avais commencé en ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      self.comboBox.setModel(self.model)
      self.comboBox.setModelColumn(NOM)
      self.mapper.addMapping(self.comboBox, NOM)
    j'ai bien les données, mais quand je fais "suivant" plusieurs fois, python plante mechamment (memoire??)
    j'ai un peu de mal avec ces notions de model j'avoue..

    merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Comment feriez-vous?
    J'utiliserais une autre table et une clef étrangère. Mais je ne sais pas pourquoi ça plante.

    Sinon, on pourrais faire plus simple pour tes boutons, en supprimant la méthode "saveRecord":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.AutoSubmit)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.connect(self.pushButton_prev, QtCore.SIGNAL("clicked()"),self.mapper, QtCore.SLOT("toPrevious()"))
    et ainsi de suite avec "toFirst", toNext", toLast".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 197
    Par défaut
    Bonjour,

    merci pour ta reponse, effectivement avec autosubmit c'est plus simple!

    concernant mes combos, j'ai fait ceci pour que ca fonctionne mais je ne sais pas si la methode est des plus judicieuses, je suis ouvert à toute ameliorations..

    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
    61
    62
    63
    64
    65
    66
    67
     
    import os
    import sys
    from PyQt4 import QtCore,QtGui,QtSql
    from ui_client import Ui_MainWindow
     
     
    CODE,NOM,PRENOM,CIVILITE,NAISSANCE,INSCRIPTION,ADRESSE = range(7)
     
    class fen(QtGui.QMainWindow,Ui_MainWindow):
     
    	FIRST, PREV, NEXT, LAST = range(4)
     
    	def __init__(self,parent=None):
    		super(fen, self).__init__(parent)
    		self.setupUi(self)		
    		self.model=QtSql.QSqlRelationalTableModel(self)
    		self.model.setTable("clients")
    		self.model.select()
    		self.modelc=QtSql.QSqlRelationalTableModel(self)
    		self.modelc.setTable("clients")
    		self.modelc.select()
    		self.mapper = QtGui.QDataWidgetMapper(self)
    		self.mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.AutoSubmit)
    		self.mapper.setModel(self.model)
     
    		self.comboCode.setModel(self.model)
    		self.comboCode.setModelColumn(CODE)
    		self.comboNom.setModel(self.modelc)
    		self.comboNom.setModelColumn(NOM)
     
    		self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self))
    		self.mapper.addMapping(self.comboCode, CODE)		
    		self.mapper.addMapping(self.comboNom, NOM)	
    		self.mapper.addMapping(self.linePrenom, PRENOM)
    		self.mapper.addMapping(self.dateNaissance, NAISSANCE)
    		self.mapper.addMapping(self.textAdresse, ADRESSE)
     
    		self.mapper.toFirst()
     
    		self.connect(self.pushButton_prem, QtCore.SIGNAL("clicked()"),self.mapper, QtCore.SLOT("toFirst()"))
    		self.connect(self.pushButton_prec, QtCore.SIGNAL("clicked()"),self.mapper, QtCore.SLOT("toPrevious()"))
    		self.connect(self.pushButton_suiv, QtCore.SIGNAL("clicked()"),self.mapper, QtCore.SLOT("toNext()"))
    		self.connect(self.pushButton_dern, QtCore.SIGNAL("clicked()"),self.mapper, QtCore.SLOT("toLast()"))
    		self.connect(self.comboCode, QtCore.SIGNAL("currentIndexChanged(int)"),
    		           lambda: self.changeComboCode())
    		self.connect(self.comboNom, QtCore.SIGNAL("currentIndexChanged(int)"),
    		           lambda: self.changeComboNom())
     
     
    	def changeComboCode(self):
    		self.mapper.setCurrentIndex(self.comboCode.currentIndex())
     
    	def changeComboNom(self):
    		self.mapper.setCurrentIndex(self.comboNom.currentIndex())
     
     
    if __name__=="__main__":
    	app=QtGui.QApplication(sys.argv)
    	filename = os.path.join(os.path.dirname(__file__),
                "c:/tmp/example")
    	db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    	db.setDatabaseName(filename)
    	ui=fen()
    	ui.show()
     
    	sys.exit(app.exec_())
    pour chaque combo, j'ai crée un QSqlRelationalTableModel. Je suppose qu'il a moyen de faire plus simple..

    mon but est de faire une interface simple comme ceci :


    faut vraiment chercher partout pour se former à pyqt..
    bien que je me debrouille en anglais, ce serait plus facile d'avoir de bons tutos en francais sur pyqt (y en a tres peu!)

    merci de votre aide!

Discussions similaires

  1. [AC-2007] ComboBox requête sql
    Par elvisogo dans le forum VBA Access
    Réponses: 5
    Dernier message: 11/03/2015, 00h43
  2. Remplir une ComboBox depuis Sql Server
    Par Jinkas dans le forum Windows Forms
    Réponses: 30
    Dernier message: 20/06/2013, 13h01
  3. ACCESS Combobox (IHM) + SQL SERVEUR procédure stockée (DATABASE)
    Par thieuma2010 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 18/05/2011, 10h41
  4. Doublon dans un Combobox requete sql
    Par bullrot dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/11/2007, 16h49
  5. combobox et sql
    Par cre3000 dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/04/2005, 15h18

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