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

Python Discussion :

Besoin d'aide pour optimisation.


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Besoin d'aide pour optimisation.
    Bonjour à tous/toutes,

    Je viens vers car j'ai un petit problème d'optimisation avec mon script Tkinter. Je vous explique un peu mon projet pour que vous compreniez la situation.
    J'ai débuté la réalisation d'un terrarium automatisé à l'aide d'un raspberry Pi. Pour le moment, le raspberry gère dans ce terrarium, un thermostat (qui fonctionne en PWM pour contrôler le chauffage), une lampe led pour l'éclairage, un serveur (Nginx), la gestion d'une page web qui se met à jour régulièrement (pour afficher les paramètres du terrarium) et l'affichage d'un petit script tkinter sur un petit écran tactile (photo en bas de sujet).Comme vous pouvez le constater, le raspberry ne chôme pas. Surtout qu'étant débutant en programmation, je dois probablement faire pas mal d'erreur dans tous mes scripts qui alourdisse encore pas mal le système.

    Voici comment il fonctionne, j'ouvre une fenêtre qui affiche les paramètres (photo en bas de sujet), ensuite, la fenêtre reste affichée quelques secondes (30) enfin la fenêtre s'autodétruit et se recharge. Ce que j'aimerais c'est que la fenêtre actualise les données,mais sans s'autodétruire et se recharger. J'ai cherché pas mal de temps et je pensais avoir trouvé quelque chose (fenêtre.update()). Le problème c'est qu'il actualisait bien les données mais à chaque fois dans une nouvelle fenêtre. Et au bout de quelques secondes, déjà une dizaine de pages, autant dire que ce n'est pas l'idéal.
    Hélas, avec mon code actuel, je vois sur le raspberry la charge du cpu qui grimpe en flèche à chaque fois que la fenêtre est détruite et se relance. J'ai peur qu'avec l'accumulation des scripts mon raspberry ne plante à cause d'une surcharge. Je vous mets mon code en bas de page.

    Merci à tous/toutes de m'avoir lu(e) jusqu'au bout (j'espère ne pas avoir fais trop de fautes d'orthographe où de grammaire).

    P.S: Je tiens à préciser que je ne vous demande évidemment pas de refaire mon code, mais de me donner des petits conseils pour alléger le code.

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    import RPi.GPIO as GPIO
    import time
     
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    pin_eclairage=18
    GPIO.setup(pin_eclairage, GPIO.OUT)
    sensmaintemp = "/sys/bus/w1/devices/28-0000063f5603/w1_slave" # sonde du point chaud.
    senscoldtemp = "/sys/bus/w1/devices/28-00000650e147/w1_slave" # sonde point froid.
     
    def currtemp(): # Fonction pour aller lire la 1er sonde de température (masquer pour une meilleur visibilité)
     
    def currtempcold(): # Fonction pour aller lire la 2ème sonde de température (masquer pour une meilleur visibilité)
     
    def main ():
        fenetre = Tk()
        fenetre.geometry("320x240+0+0")
        fenetre.resizable(width=False,height=False)
        temp_froid= currtempcold()
        temp_chaud=currtemp()
        def etat_eclairage():
            if GPIO.input(pin_eclairage) == 1 :
                return ("on")
            else:
                return ("off")
        eclairage = etat_eclairage()
     
     
        l = LabelFrame(fenetre, text="Paramètres du terrarium :")
        l.pack(fill="both", expand="yes")
        label1 = Label(l, text="Température point chaud :")
        label1.grid(row=1,column=1)
        label2 = Label(l, text="Température point froid :")
        label2.grid(row=2,column=1)
        label3 = Label(l, text="État de l'éclairage :")
        label3.grid(row=3,column=1)
        label = Label(l, text="État du chauffage :")
        label.grid(row=4,column=1)
        label = Label(l, text= temp_chaud)
        label.grid(row=1,column=2)
        label = Label(l, text=temp_froid)
        label.grid(row=2,column=2)
        label = Label(l, text=eclairage)
        label.grid(row=3,column=2)
        label = Label(l, text=etat_chauffage)
        label.grid(row=4,column=2)
        fenetre.update()
        time.sleep(30)
        fenetre.destroy()
     
    while (True):
        try:
            main()
        except KeyboardInterrupt:
            pass
    Voici la photo :


  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    La structure de votre programme devrait ressembler à ceci:
    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
    import tkinter as tk
    from random import randint
     
    def do_refresh(delay=500):
     
        value = randint(0, 100)
        variable.set(value)
     
        root.after(delay, do_refresh)
     
    root = tk.Tk()
    variable = tk.StringVar()
    tk.Label(root, textvariable=variable).pack()
    do_refresh()
    tk.mainloop()
    "do_refresh" est un callback qui se lance, ici, toutes les 500 ms pour mettre à jour les valeurs côté affichage. Comme je n'ai pas de capteurs à lire, j'ai utilisé la fonction randint histoire qu'on voit bouger qqc. et une seule variable.

    Pour les explications, vous avez un bon tuto. le Swinnen.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse, cela fonctionne parfaitement.

    P.S: Je ne sais pas si il faut passer le sujet en résolu ?

    Encore merci.

Discussions similaires

  1. Besoin d'aide pour optimiser une petite query sql
    Par AsmCode dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/01/2009, 14h52
  2. [PL / SQL] Besoin d'aide pour Optimisation
    Par shaun_the_sheep dans le forum SQL
    Réponses: 24
    Dernier message: 13/02/2007, 14h32
  3. Besoin d'aide pour optimiser du code
    Par scaleo dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2007, 13h56
  4. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  5. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02

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