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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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