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

Tkinter Python Discussion :

Ecart-type de données Tkinter


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut Ecart-type de données Tkinter
    Bonjour,

    Je souhaiterais afficher en continu dans un widget (label) les valeurs obtenues via un convertisseur. Ces valeus doivent être 'lissés', je dois donc afficher le résultat de l'écart type réalisé sur 10 valeurs laissés en mémoire tampon, et cela en continu.

    J'ai réalisé ce code mais cela ne mesure pas la dispersions des valeurs.

    Cela m'affiche comme message d'erreur: 'int object is not callable', pour la ligne correspondant au calcul de ecart_type.

    Pourriez-vous m'aider?

    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
     
    def convert (event=None):
        global valueADC
        for i in range(10):
            val1= adc.read_adc(1, gain=GAIN)
            val2= []
            val2.append(val1)
            somme=sum(val2)
            N=10
            moyenne=somme/N
            ecart_type=sqrt((somme(val1-moyenne)**2)/N)
            valueADC.set(ecart_type)
            label9.after(100,ADC)
     
    root=Tk()
    Button(root,text="Donnee", command= convert)
    label9=Label(root, textvariable=valueADC)
     
    root=mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Salut,

    somme est un entier (car le retour de sum(...) lui a été assigné).
    Donc somme(....) - les parenthèses font l'appel de fonction - ne peut pas dire autre chose que 'int object is not callable'.
    Pour le reste, le code que vous avez essayé d'écrire est incompréhensible probablement à cause d'indentations oubliées (mais pas que...).

    - W

  3. #3
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    Merci pour votre retour.

    Finalement, dans un premier temps je calcul seulement la moyenne sur 10 valeurs acquises par le convertisseur. Partant de ce principe, je voudrais avoir dans ma variable de type liste les "10 valeurs renouvelées" c'est à dire retiré la plus ancienne valeur pour y ajouter la nouvelle valeur afin de pouvoir en paralléle mesurer la moyenne.


    Mais le probléme est comment faire pour supprimer à chaque tour de boucle la plus ancienne valeur acquise afin d'ajouter la nouvelle?

    Voici la portion de code que j'ai pu fair, mais je vous avoue que je reste bloqué...

    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
     
    def ADC (event=None):
        global valueADC, values
     
        for i in range(10): 
            vals = adc.read_adc(1, gain=GAIN)  
            values.append(vals)
            print('| {0:>6}  |'.format(vals))
            valueADCx= (sum (values)/len(values))
            valueADC.set(valueADCx)
     
        for i in range(10):
            values[i]= values[i-1]
            values[-1]=vals 
            '''valueADC= moyenne(values)'''
        print (valueADCx)
        label9.after(100,ADC)
     
    root=Tk
     
    bouton3=Button(root,text="Donnée", command= ADC, padx=10, pady=10, width=10)
    bouton3.config(font=('arial', 12, 'bold'))
    bouton3.grid(row=2, column=1)
     
    valueADC=StringVar()
     
    label9=Label(root, textvariable=valueADC, width=12, height=2)
    label9.config(font=('arial', 15, 'bold'))
    label9.grid(row=2, column=2)
    root=mainloop()
    Merci d'avance.

    Cordialement.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Salut,

    Citation Envoyé par Cerise22 Voir le message
    Finalement, dans un premier temps je calcul seulement la moyenne sur 10 valeurs acquises par le convertisseur. Partant de ce principe, je voudrais avoir dans ma variable de type liste les "10 valeurs renouvelées" c'est à dire retiré la plus ancienne valeur pour y ajouter la nouvelle valeur afin de pouvoir en paralléle mesurer la moyenne
    Vos explications en français ne sont pas plus claires que votre code.
    Vous récupérez 10 nouvelles valeurs toutes les 100 ms.
    Pour remplacer les anciennes valeurs, initialiser la liste values à vide suffit.

    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for i in range(10): 
            vals = adc.read_adc(1, gain=GAIN)  
            values.append(vals)
            print('| {0:>6}  |'.format(vals))
            valueADCx= (sum (values)/len(values))
            valueADC.set(valueADCx)
    Inutile d'avoir les 2 dernières lignes dans le block "for": vous ne verrez s'afficher que la dernière ligne dans label9.

    - W

  5. #5
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Désolé pour mon expression écrite... pas facile d'expliquer mon probléme.

    Concernant mon programme: Je ne veux pas remplacer toutes les anciennes valeur mais seulement une seule, la plus ancienne.

    Je pense utiliser la méthode slice, une méthode qui permet de remplacer des valeurs d'une list par tranche. Et je pense pouvoir arrivé à la solution...

    Par exemple:

    values [0:9]
    X[1:10]= values
    values[0:1]= vals #on ajoute à la liste ,à la position 0, la nouvelle acquisition de valeur du convertisseur.

    Je pense être dans la bonne voie, à votre avis?

    Merci.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Désolé pour mon expression écrite... pas facile d'expliquer mon probléme.

    Concernant mon programme: Je ne veux pas remplacer toutes les anciennes valeur mais seulement une seule, la plus ancienne.
    La deuxième fois que le callback ADC sera appelé, vous aurez 10 valeurs "anciennes" et 10 nouvelles valeurs.
    Admettons que la plus ancienne soit celle d'index 0, vous ne pourrez la remplacer (si cela à du sens) que par une seule des nouvelles valeurs.
    Si vous n'arrivez pas à exprimer ce que vous voulez faire en bon français, vous coderez peut être un truc qui fonctionne mais pas sur que çà fasse ce qui est attendu.

    - W

  7. #7
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    En effet, je souhaite remplacer la valeur la plus ancienne que par une seule des nouvelles valeurs.

    Et pour cela, je pense opter pour l'utilisation de la méhthode slice qui me permettra de découper ma list, et d'y rajouter ensuite la nouvelle valeur..

    Pensez vous que cela soit possible avec cette méthode?

    Merci.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    En effet, je souhaite remplacer la valeur la plus ancienne que par une seule des nouvelles valeurs.

    Et pour cela, je pense opter pour l'utilisation de la méhthode slice qui me permettra de découper ma list, et d'y rajouter ensuite la nouvelle valeur..

    Pensez vous que cela soit possible avec cette méthode?
    "slice" va vous retourner une liste, vous voulez un nombre. En physique, on dirait que l'équation au dimension n'étant pas homogène, il y a de fortes chances pour que çà vous mène nulle part.
    Pour remplacer l'objet à l'indice "i" par celui de l'indice "j", écrire L[i] = L[j] suffit.

    - W

  9. #9
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Oui, cette méthode slice va me retourner une list, qui contiendra les 10 valeurs dont je vais calculer la moyenne. Pour ensuite faire afficher son résultat dans le label.

    Le probléme que je rencontre est que je ne sais pas comment "translater" mes 9 valeurs vers la droite, pour laisser un emplacement à la nouvelle valeur.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Le probléme que je rencontre est que je ne sais pas comment "translater" mes 9 valeurs vers la droite, pour laisser un emplacement à la nouvelle valeur.
    Dans ce cas là, il faut revoir votre tuto. sur les listes et faire des essais à la console.
    On part d'une liste:
    Si on veut insérer un élément au début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> L.insert(0, 0)
    >>> L
    [0, 1, 2, 3, 4]
    - W

  11. #11
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    Malheureusement je ne sais pas comment faire pour aboutir, au cours de l'éxécution du programme, aux opérations suivantes:

    -Faire l'acquisition de 10 valeurs de conversion de l'ADC.
    -Afficher la moyenne de ces 10 valeurs dans un label
    -A chaque acquisition de données: je veux "translater" la variable list obtenue, afin d'y insérer la derniére nouvelle valeur d'acquisition.
    Par exemple:
    • Premiére instruction: acquisition de 10 valeur de l'ADC: [10,11,12,13,14,15,16,17,18,19]
    • Deuxiéme instruction: Calcul de la moyenne et affichage de la valeur dans un label
    • Troisiéme instruction: translate la liste vers la droite pour insérer la nouvelle valeur acquise (X), afin d'avoir au total 10 valeurs dans la list: [X,10,11,12,13,14,15,16,17,18]
    • Calcul de la moyenne et affichage de la valeur dans un label
    • [X,X, 10,11,12,13,14,15,16,17]
    • Calcul de la moyenne et affichage de la valeur dans un label
    • Faire les mémes opérations jusqu'a l'arrêt du programme



    Pour la suppression de la dernier valeurs, j'utilise la méthode: del val[9]
    Pour insérer la nouvelle valeur à l'indice 0 de la list j'utilise: val.insert(0, values) avec "values=adc.read_adc(1, gain=GAIN)"

    Pourriez-vous m'aider svp à éclaircir mon probléme?

    En vous remerciant infiniment, car je ne sais pas comment faire, pour translater ma liste et appliquer l'algorithme ci-dessus.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Salut,

    Si j'essaie de comprendre:

    • Premiére instruction: acquisition de 10 valeur de l'ADC: [10,11,12,13,14,15,16,17,18,19]
    • Deuxiéme instruction: Calcul de la moyenne et affichage de la valeur dans un label
    • Troisiéme instruction: translate la liste vers la droite pour insérer la nouvelle valeur acquise (X), afin d'avoir au total 10 valeurs dans la list: [X,10,11,12,13,14,15,16,17,18]
    j'arrête à "troisième instruction": d'où sort cette nouvelle valeur acquise?
    Que chaque étape de votre code se ramène à une instruction, pourquoi pas... Néanmoins le .after va exécuter n-fois le même code, ce ne sont pas des itérations mais des appels successifs à un callback/fonction qui s'attendent à trouver des objets (globaux) et qui les modifient. Essayez de le traduire dans votre description.

    Pour la suppression de la dernier valeurs, j'utilise la méthode: del.val[9]
    Pour insérer la nouvelle valeur à l'indice 0 de la list j'utilise: val.insert(0, values) avec "values=adc.read_adc(1, gain=GAIN)"
    ben çà fait un décalage, mais vu les questions précédentes, çà ne fait peut être pas ce que vous voulez...

    - W

  13. #13
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    La nouvelle valeur acquise provient de la lecture de la voie du convertisseur: adc.read_adc(1, gain=GAIN).

    Essayez de le traduire dans votre description.
    Qu'entendez-vous par là?

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    La nouvelle valeur acquise provient de la lecture de la voie du convertisseur: adc.read_adc(1, gain=GAIN).

    Qu'entendez-vous par là?
    Qu'on ne voit pas bien où sont les lectures adc.read_adc(1, gain=GAIN): une fois c'est 10, après c'est une...
    Est-ce qu'ils sont faits à la suite (pourquoi ne pas en lire 11 plutôt que 10), au prochain appel,...
    Que deviennent les données lues à l'appel précédent...

    - W

  15. #15
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Au premier lancement du programme, on doit nécessairement avoir 10 acquisition de valeurs du convertisseur pour afficher la premiére moyenne dans le label. D'ou la nécessité de lire 10 valeurs dans un premier temps et ensuite seulement 1 valeur pour pouvoir supprimer la premiére et insérer cette nouvelle valeur dans la list val[0].

    Les données lues doivent être enregistré dans une mémoire tampon, pour ensuite manipuler la list (supprimer, insérer).

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Au premier lancement du programme, on doit nécessairement avoir 10 acquisition de valeurs du convertisseur pour afficher la premiére moyenne dans le label. D'ou la nécessité de lire 10 valeurs dans un premier temps et ensuite seulement 1 valeur pour pouvoir supprimer la premiére et insérer cette nouvelle valeur dans la list val[0].
    Bon ben, vous n'avez plus qu'à coder çà.
    note: re-visitez l'indice de la valeur à supprimer: la plus vieille à l'index 0 et la plus jeune à l'index 9.

    - W

  17. #17
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Comme dit précedemment, je ne sais pas comment translater ma list vers la droite, pour insérer la nouvelle valeur.

    N'auriez vous pas une idée?

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Comme dit précedemment, je ne sais pas comment translater ma list vers la droite, pour insérer la nouvelle valeur.

    N'auriez vous pas une idée?
    Les instructions (que vous avez) données précédemment del val[9], val.insert(0,...) devraient le faire non?

    - W

  19. #19
    Membre du Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Points : 43
    Points
    43
    Par défaut
    Non malheureusement, cela ne fonctionne pas.

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Cerise22 Voir le message
    Non malheureusement, cela ne fonctionne pas.
    Les instructions devraient fonctionner, par contre comment vous les avez utilisées dans votre code, c'est autre chose et si vous ne le montrez pas...

    - W

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 15h50
  2. Types de données interbase
    Par Clotilde dans le forum InterBase
    Réponses: 2
    Dernier message: 18/11/2003, 15h10
  3. Réponses: 2
    Dernier message: 22/09/2003, 12h23
  4. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 16h15
  5. Réponses: 2
    Dernier message: 01/04/2003, 23h09

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