Comment utiliser le réceptioonnaire d'évenement pour tester en permanence une en

fbeauch Messages postés 1 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 7 avril 2010 - 7 avril 2010 à 19:50
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 2 mai 2010 à 00:50
Bonjour à tous

J'ai besoin d'aide pour élaborer un petit programme qui teste en continue une entrée et qui en fonction de sa valeur envoie une valeur ou une autre sur le port parallèle. Voici mon programme ci-dessous. getInPaperOut est l'entrée que je teste. Le problème c'est que le test de condition n'est éxécuté qu'une fois au lancement de la fenêtre alors que je voudrais que le réceptionnaire d'évenement de Tkinter lance en permanence en tache de fond ce test.
merci

from Tkinter import *
from parallel import *


fenetre = Tk()
p=Parallel()


Titre_fenetre Label(fenetre,text 'commande port parallele')
Titre_fenetre.pack()

bouton_quitter=Button(fenetre,text='Quitter',command=fenetre.quit)
bouton_quitter.pack()

if p.getInPaperOut()==True : #test de l'entrée PaperOut
p.setData(1)
else :
p.setData(2)


fenetre.mainloop() # demarrage receptionnaire evt

p.setData(0) # remise à 0 des sorties du port parallele
fenetre.destroy()

1 réponse

didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
2 mai 2010 à 00:50
Salut,

Pour cela, il existe un modèle qui s'appel MCV ; Pour "Modèle Vue Contrôleur". Quasiment toutes les applications sont développées sur ce modèle. Pour faire simple, tu as plusieurs "Objets" : des objets observateurs (qui attendent des changement d'état) et des objets observés.

Exemple d'un objet observé :
#!/bin/python
# -*- coding: utf-8 -*-

class Observed :
    
    #Créer un nouvel objet "Observed"
    def __init__ (self, name) :
        self._name = name
        self.listObservers = []
        self.maVariable = ""
        return
    
    
    #On ajoute de nouveaux observateurs
    def addObserver (self, observer) :
        self.listObservers.append(observer)
        return
    
    #On peut aussi en supprimer..
    def removeObserver (self, observer) :
        self.listObservers.remove(observer)
        return
    
    #Lors que ta variable va changer d'état on 
    #appel cette fonction qui est chargé d'en 
    #avertir les observateurs; On leur précise 
    #que c'est cet objet qui a changé d'état..
    def notifying (self) :
        for o in self.listObservers :
            o.stateChanged(self)
        return
    

    #Ici on change l'état de la variable
    def setVariable (self, newValue) :
        #Hop, la variable a changé d'état
        self.maVariable = newValue
        #On averti les autres !
        self.notifying()
        return
    
    #On permet à l'utilisateur de récupérer la nouvelle valeur
    def getVariable (self) :
        return self.maVariable


Exemple d'un objet observateur :
#!/bin/python
# -*- coding: utf-8 -*-

class Observer :
    
    #Créer un nouvel objet observateur
    def __init__ (self, name) :
        self._name = name
        return
    
    
    #La fonction qui est appellée par l'observé lorsqu'il à changé..
    def stateChanged (self, object) :
        newValue = object.getVariable()
        print(str(self._name) + " observing " + str(object._name) + " has detected a change : new value = " + str(newValue))
        return
    
    #On s'ajoute parmis les observateurs de "object"..
    def observing (self, object) :
        object.addObserver(self)
        return


Et enfin le Main :
#!/bin/python
# -*- coding: utf-8 -*-

#On import les modules créer
import Observer
import Observed


#code principal de l'application
if __name__ == "__main__" :
    
    #On créer deux objets qui vont être observés
    observed1 = Observed.Observed("Observed1")
    observed2 = Observed.Observed("Observed2")
    
    #On créer deux observateurs
    observer1 = Observer.Observer("Observer1")
    observer2 = Observer.Observer("Observer2")
    
    #Le premier observateur doit observer "observed1" et "observed2"
    observer1.observing(observed1)
    observer1.observing(observed2)
    
    #Le deuxième observateur doit observer "observed2"
    observer2.observing(observed2)
    
    #On applique un nouvelle valeur aux variables de "observed1" et "observed2"
    observed1.setVariable("new 1 !")
    observed2.setVariable("new 2 !")


A l'exécution de ce code, à quoi est-ce qu'on s'attend ?!
=> un message de la part de "observer1" a propos de "observed1" et "observed2"
=> et un message de la part de "observer2" de la part de "observe2"


Je reconnais le modèle MVC peut paraitre un peu compliqué, mais il est beaucoup plus efficace ..
Ou sinon tu as toujours une méthode un peu plus archaïque : tu mets le teste dans une boucle sans fin que tu places dans un Thread pour ne pas bloque le programme sur la boucle..

PS : Si tu souhaites exécuter ce code, il faut placer chacune des classes dans un module différent, portant le nom de la classe qu'il contient (en respectant la case ..).
0
Rejoignez-nous