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

GUI Python Discussion :

pyQt : QCombobox aui n'affiche pas tous ses Items


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut pyQt : QCombobox aui n'affiche pas tous ses Items
    Bonjour,

    J'ai créé une interface user avec une simple Qcombobox. C'est Qcombobox se remplis automatiquement via un table dans une base de donnée Postgresql. Ma table postgresql contient 3916 lignes. Lorsque je conte les Ittems de ma combobox j'ai bien le même chiffre.

    Le soucie est que lors de l'affichage, je ne retrouve pas toutes mes lignes et deplus c'est pas dans le bon ordre. Exemple :
    [INDENT]index 1 = Ligne 1774 de ma table, index 5 = ligne 1805 et si je vais au dernier index, j'ai bien index 3916 mais la dernière ligne de ma table.[/INDENT]

    Auriew vous une idée pour débuger cela ?

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Une QComboBox avec 3916 items ? Rudement pratique ça.

    Il existe d'autres widgets que la combo box pour la sélection de données.

    Enfin, montre-nous le code avec lequel tu remplis la QComboBox, parce que là on ne peut rien dire.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Je sais pas top avec autant de lignes ^^ tu as un Widget particulier en tête plsu optimal pour ce que je veux faire ? je suis encore novice, j'ai fait dans le basic ^^

    Mon code est le suivant :
    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
    68
    69
    70
    71
     
    from PyQt4 import QtCore
    from PyQt4 import QtGui
    import psycopg2
    import sys
     
    class COMBOBOX(QtGui.QWidget):
     
        def __init__(self, ):
            super(COMBOBOX, self).__init__()
            self.initUI()
     
        def initUI(self):      
            ###Widget   
            self.lbl = QtGui.QLabel("TESTING", self)
            self.lbl.move(50, 100)
            self.lbl2 = QtGui.QLabel("index", self)
            self.lbl2.move(50, 120)
            self.combo = QtGui.QComboBox(self)
     
            self.combo.setGeometry(50,20,250,20)
            self.combo.activated[str].connect(self.sirdSelection)
            self.setGeometry(300, 300, 400, 150)
            self.setWindowTitle('QtGui.QComboBox')
            self.show()
     
     
            ##Connexion
            try:
                conn = psycopg2.connect("dbname='postgis_21_sample' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            curs = conn.cursor()
            ##Remplissage Cb
            self.listeSIRD= curs.execute("SELECT srtext FROM spatial_ref_sys;")
            self.listeSIRD= curs.fetchall()
     
            for row in self.listeSIRD :
                self.combo.addItem(str(row))
            ##Count les lignes dans la table
            self.listeNB= curs.execute("SELECT COUNT(srtext) FROM spatial_ref_sys;")
            self.listeNB= curs.fetchall()
            for row in self.listeNB :
                print "Nombre de ligne compter dans la tabel postgis :" , self.listeNB
            #Count combobox
            comboNB = self.combo.count()
     
            print"Nombre de ligne compter dans la combo : " ,comboNB
     
            conn.close()
     
        def sirdSelection(self,sird):
            #Selection index
            comboIndex =self.combo.currentIndex()
            comboIndex= comboIndex+1
            print"Index de la ligne selectionner : " , comboIndex
     
     
            self.lbl.setText(sird)
            self.lbl.adjustSize()
     
     
    def main():
     
        app = QtGui.QApplication(sys.argv)
        ex = COMBOBOX()
        sys.exit(app.exec_())
     
     
    if __name__ == '__main__':
        main()

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je n'ai pas de widget en particulier à te proposer parce que je ne sais pas ce dont tu as besoin.

    L'utilisateur doit-il chercher ses données dans ce widget ? Alors il faut effectivement trouver mieux.

    Est-ce que ces données sont classables par catégorie et donc pouvant être réparties dans différent widgets.

    Et pourquoi pas un tableau, après tout ?

    Il n'y a que toi qui connaît le but poursuivi.


    Par contre j'ai regardé ton code.

    Il est préférable que tu sépares l'application de l'interface.
    Il faut absolument utiliser les layouts dans l'interface, les positionnement codés en dur deviennent vite ingérables et ton interface n'est pas redimensionnable.

    Je te montre un exemple basique:
    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
    68
     
    # -*- coding: utf-8 -*-
     
    import sys
    import os
     
    from PyQt4 import QtCore
    from PyQt4 import QtGui
     
    class Main(object):
        def __init__(self):
            # Ici tu implémentes le nécéssaire de ton appli
            self.ui = MainUI(self)
            self.ui.show()
     
            db = self.get_db()
            if not db:
                # Y a un blème afficher erreur et quitter 
                # ou ouvrir un dialogue pour chercher la db
                pass
     
            dat = self.set_data()
            if dat is not None:
                # pareil, afficher l'erreur (contenue dans dat) et puis ...
                print dat
     
        def get_db(self):
            if not os.path.isfile('blabla/postgis_21_sample'):
                return False
            return True
     
        def set_data(self):
            # Je n'utilise pas psycopg2 donc je suppose que tu es sure de ta mèthode
            try:
                conn = psycopg2.connect("dbname='postgis_21_sample' user='postgres' \
                                        host='localhost' password='postgresql'")
            except Exception as why:
                return why
     
            curs = conn.cursor()
            self.listeSIRD= curs.execute("SELECT srtext FROM spatial_ref_sys;")
            self.listeSIRD= curs.fetchall()
     
            for row in self.listeSIRD :
                self.ui.combo.addItem(str(row))
     
     
    class MainUI(QtGui.QMainWindow):
        def __init__(self, main):
            super(MainUI, self).__init__()
            # on garde une ref de l'appli
            self.main = main
            self.widget = QtGui.QWidget(self)
            gridLayout = QtGui.QGridLayout(self.widget)
            vLayout = QtGui.QVBoxLayout()
            self.label = QtGui.QLabel('Label', self)
            vLayout.addWidget(self.label)
            self.label_1 = QtGui.QLabel('Label 1', self)
            vLayout.addWidget(self.label_1)
            self.comboBox = QtGui.QComboBox(self)
            vLayout.addWidget(self.comboBox)
            gridLayout.addLayout(vLayout, 0, 0, 1, 1)
            self.setCentralWidget(self.widget)
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        main = Main()
        sys.exit(app.exec_())
    Regarde les commentaires du code. Et teste le, je n'ai pas testé la partie base de données.

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    L'utilisateur doit-il chercher ses données dans ce widget ? Alors il faut effectivement trouver mieux.
    Les données sont des reférences à un système de coordonnées particulier. En fait, il selectionne le referentiel qu'il souhaite ensuite utiliser.
    Le top serait un ou plusieurs widgets avec les quels l'utilisateur pourrait :
    -Selectionner directement le referentiel
    -Tapper des mot clé pour aller chercher le referentiel plus rapidement

    Est-ce que ces données sont classables par catégorie et donc pouvant être réparties dans différent widgets.
    Non, les données sont une simple chaine de caractère indiquant un systeme referentiel spacial.

    Et pourquoi pas un tableau, après tout ?
    Les données sont dans une table autogénéré par posgresql-PostGIS , je ne peux la modifier.

    [QUOTE]]Il est préférable que tu sépares l'application de l'interface. [/QUOTE
    Ok je vais faire une classe pour l'application

    Il faut absolument utiliser les layouts dans l'interface, les positionnement codés en dur deviennent vite ingérables et ton interface n'est pas redimensionnable.
    Le code founi n'est le "réel" code de mon aplli, juste une micro partie. Dans mes différentes UI, j'utilise bien les layout. Avec Qt designer c'est vraiment génial^^


    MERCI pour les commentaires sur mon code ! Je vais essayer d'appliquer tes conseils pour le reste de mon appli !

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Si tu utilises Qt Designer t'as droit à un bon point.

    Quand je parle de tableau, je ne dis pas qu'il faut modifier quoi que ce soit de ta bd mais Qt dispose de widgets pour afficher des données tabulaires sinon ordonnées d'une manière ou d'une autre.

    Pour les mots clés il est simple de mettre en oeuvre un QLineEdit avec autocomplétion et même un historique des dernières entrées.

    As-tu un exemple de données et de ce que tu appelles référentiel, par exemple en utilisant ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.listeSIRD= curs.fetchall()
    que donnent les dix premières row ?

Discussions similaires

  1. Mon diaporama ne s'affiche pas à tous les coups !
    Par dekaki dans le forum jQuery
    Réponses: 2
    Dernier message: 17/11/2011, 09h08
  2. [AC-2003] Mon état n'affiche pas tous les enregistrements
    Par yael44 dans le forum IHM
    Réponses: 1
    Dernier message: 01/11/2009, 20h04
  3. Réponses: 17
    Dernier message: 17/07/2008, 23h32
  4. Réponses: 1
    Dernier message: 26/10/2006, 17h44

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