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 :

saisir les chiffres seulement dans un tableau qtablewidget


Sujet :

PyQt Python

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut saisir les chiffres seulement dans un tableau qtablewidget
    Bonjour,
    Je souhaite saisir seulement les chiffres dans un tableau avec qdoublevalidator sachant qu'on peut copier et coller les données dans Excel.
    Voici le code que je n'arrive pas.
    Merci d'avance pour votre aide

    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
     
    import sys  
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
     
    class MyTableWidget(QWidgets):
        def __init__(self):  
            super().__init__() 
            self.table = QTableWidget(self)
            self.table.setRowCount(4)  
            self.table.setColumnCount(4)
            vbox = QVBoxLayout()    
            vbox.addWidget(self.table)
            vbox.addStretch(1)   
            self.setGeometry(100, 100, 500, 500)
     
    #saisir les chiffres seulement
            self.edit = QLineEdit()
            validator = QDoubleValidator()
            self.edit.setValidator(validator)
     
    # pour copier et coller les données
            self.table.setFocus()
            self.table.setCurrentCell(0, 0)
     
        def copier(self):
            selected = self.table.selectedRanges()
            texte = ""
            for i in range(selected[0].topRow(), selected[0].bottomRow() + 1):
                for j in range(selected[0].leftColumn(), selected[0].rightColumn() + 1):
                         texte += self.table.item(i, j).text() + "\t"
                texte = texte[:-1] + "\n"  # le [:-1] élimine le '\t' en trop
            QApplication.clipboard().setText(texte)
     
        def coller(self):
            selected = self.table.selectedRanges()
            row0 = selected[0].topRow()
            col0 = selected[0].leftColumn()
            texte = QApplication.clipboard().text()
            for i, texteligne in enumerate(texte.split('\n')):
                for j, textecase in enumerate(texteligne.split('\t')):
                    self.table.setItem(row0 + i, col0 + j, QTableWidgetItem(textecase))
     
        def keyPressEvent(self, event): 
            if self.table.hasFocus():
                if event.key() == Qt.Key_C and  (event.modifiers() & Qt.ControlModifier):
                    self.copier()
                    event.accept()
                if event.key() == Qt.Key_V and  (event.modifiers() & Qt.ControlModifier):
                    self.coller()
                    event.accept()
                else:
                    event.ignore()
            else:
                event.ignore()
     
    if __name__ == '__main__':  
        app = QApplication(sys.argv)  
        w = MyTableWidget()
        w.show()   
        sys.exit(app.exec_())

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quelques pistes:

    Dans chaque case du tableau, il faut ajouter un QLineEdit avec son QDoubleValidator grâce à un setCellWidget.

    Le QDoubleValidator doit faire l'objet de 2 précisions:

    1- la norme du pays: puisqu'il y a du copier/coller, il faut une virgule pour un Excel français, c'est à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.valid.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France))
    Mais si on a un Excel de langue anglaise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.valid.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedKingdom))
    2- il faut dire si on veut saisir des nombres flottants "normaux":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.valid.setNotation(QtGui.QDoubleValidator.StandardNotation)
    ou avec la notation scientifique (avec exposant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.valid.setNotation(QtGui.QDoubleValidator.ScientificNotation
    On peut aussi préciser la plage des nombres à saisir, par exemple pour un pourcentage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.valid.setRange(+0.0, +100.0, 2) # le 2, c'est pour 2 chiffres après la virgule
    Avec ça, les cases n'accepteront que les nombres valides!

    Doc: https://doc.qt.io/qt-5/qdoublevalidator.html

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Merci beaucoup pour ton aide qui est très utile

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Bonjour,
    Voici le code pour QDoubleValidator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            for i in range(self.table.rowCount()):
                for j in range(self.table.columnCount()):
                    self.edit=QLineEdit()
                    validator=QDoubleValidator()
                    self.edit.setValidator(validator)
                    self.table.setCellWidget(i,j,self.edit)
    Tes codes copier/coller sont à mettre où dans mon code car je n'arrive pas ?
    Merci d'avance pour votre aide

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Bonjour,

    Voici le code pour QDoubleValidator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            for i in range(self.table.rowCount()):
                for j in range(self.table.columnCount()):
                    self.edit=QLineEdit()
                    validator=QDoubleValidator()
                    self.edit.setValidator(validator)
                    self.table.setCellWidget(i,j,self.edit)
    C'est bon pour ce code ?

    Tes codes copier/coller sont à mettre où dans mon code car je n'arrive pas ?

    Merci d'avance pour votre aide

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un exemple pour test:

    J'ai choisi la saisie d'un nombre flottant avec virgule selon le format d'un pourcentage avec 2 chiffres après la virgule.

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.resize(500,200)
     
            self.table = QtWidgets.QTableWidget(self)
            self.table.setRowCount(4)  
            self.table.setColumnCount(4)
     
            for i in range(self.table.rowCount()):
                for j in range(self.table.columnCount()):
                    edit = QtWidgets.QLineEdit()
                    validator = QtGui.QDoubleValidator()
     
                    validator.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France)) # pour Excel français avec virgule
                    validator.setNotation(QtGui.QDoubleValidator.StandardNotation) # pour flottants sans exposant
                    validator.setRange(+0.0, +100.0, 2) # pour saisi de % avec 2 chiffres après la virgule
     
                    edit.setValidator(validator)
                    self.table.setCellWidget(i, j, edit)        
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.table, 0, 0)
            self.setLayout(posit)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Avec ton code, on ne peut pas copier et coller tous les données dans Excel.

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par kloram Voir le message
    Avec ton code, on ne peut pas copier et coller tous les données dans Excel.
    J'avais essayé de copier/coller une seule case, mais pas plus. Si on veut copier/coller une zone rectangulaire de plusieurs cases, c'est plus compliqué. Il faut d'abord utliliser un "delegate" qui est un objet pour éditer les cases, et qui permettra leurs sélections. Il faut aussi pouvoir saisir les touches Ctrl-C et ctrl-V pour déclencher les copier-coller.

    Voilà le code complet. Il permet:
    - de ne saisir dans les cases que les nombres définis par le QDoubleValidator
    - de copier une zone du tableau dans Excel
    - de coller une zone du tableau issu d'Excel

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    #############################################################################
    class MonDelegate(QtWidgets.QItemDelegate):
     
        #========================================================================
        def createEditor(self, parent, option, index):
            """crée les widgets utilisés pour l'édition
            """
            edit = QtWidgets.QLineEdit(parent)
            validator = QtGui.QDoubleValidator()
     
            validator.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France)) # pour Excel français avec virgule
            validator.setNotation(QtGui.QDoubleValidator.StandardNotation) # pour flottants sans exposant
            validator.setRange(+0.0, +100.0, 2) # pour saisi de % avec 2 chiffres après la virgule
     
            edit.setValidator(validator)
            return edit        
     
        #========================================================================
        def setEditorData(self, editor, index):
            """exécuté lors de l'entrée en édition
            """
            edit = editor
            value = index.model().data(index, QtCore.Qt.EditRole)     
            edit.setText(value)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            # définit la taille de la fenêtre
            self.resize(500,200)
     
            # crée la table
            self.table = QtWidgets.QTableWidget(self)
            self.table.setRowCount(4)  
            self.table.setColumnCount(4)
     
            # définit le mode de sélection 
            self.table.setSelectionMode(QtWidgets.QAbstractItemView.ContiguousSelection)
     
            # crée le delegate
            self.mondelegate = MonDelegate(self.table)
            self.table.setItemDelegate(self.mondelegate) 
     
            # positionne la table dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.table, 0, 0)
            self.setLayout(posit)
     
        #========================================================================
        def copier(self):
            """copie les valeurs sélectionnées dans le clipboard
            """
            selected = self.table.selectedRanges() # zone sélectionnée à copier
            texte = ""
            for i in range(selected[0].topRow(), selected[0].bottomRow() + 1):
                for j in range(selected[0].leftColumn(), selected[0].rightColumn() + 1):
                    texte += self.table.item(i, j).text() + "\t"
                texte = texte[:-1] #élimine le dernier '\t' en trop
                if i != selected[0].bottomRow():
                    texte += "\n"  # ajoute une fin de ligne (sauf pour la dernière)
            # place le texte dans le clipboard
            QtWidgets.QApplication.clipboard().setText(texte)
     
        #========================================================================
        def coller(self):
            """colle les données du clipboard à partir de la case sélectionnée
            """
            selected = self.table.selectedRanges()
            row0 = selected[0].topRow()
            col0 = selected[0].leftColumn()
            texte = QtWidgets.QApplication.clipboard().text()
            for i, texteligne in enumerate(texte.split('\n')):
                for j, textecase in enumerate(texteligne.split('\t')):
                    self.table.setItem(row0 + i, col0 + j, QtWidgets.QTableWidgetItem(textecase))
     
        #========================================================================
        def keyPressEvent(self, event):
            """lance des actions avec certaines touches clavier
            """ 
            if self.table.hasFocus():
                # Ctrl-C pour copier une zone sélectionnée dans le clipboard
                if event.key() == QtCore.Qt.Key_C and  (event.modifiers() & QtCore.Qt.ControlModifier):
                    self.copier()
                    event.accept()
                # Ctrl-V pour coller une zone du clipboard
                if event.key() == QtCore.Qt.Key_V and  (event.modifiers() & QtCore.Qt.ControlModifier):
                    self.coller()
                    event.accept()
                else:
                    event.ignore()
            else:
                event.ignore()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Ca marche.
    Merci beaucoup pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. saisir elements arbre binaire dans un tableau
    Par babylone_59 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 25/10/2006, 15h38
  2. [Conception] Afficher les données (BDD) dans un tableau en PHP
    Par ox@na dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/09/2006, 15h24
  3. Réponses: 1
    Dernier message: 01/05/2006, 11h17
  4. Réponses: 15
    Dernier message: 02/12/2005, 17h12
  5. Éliminer les lignes blanches dans un tableau
    Par DenPro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/11/2004, 01h27

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