Bonjour à tous,

Pour mon premier post, je rentre d'emblée dans un sujet difficile (pour moi). J'utilise Python 2.6 sous XP : un gros point noir pour moi dans l'utilisation de Python : la compréhension et donc la constitution de classes.
Mais je m'éloigne un peu de mon sujet : on a sollicité de ma part une aide que je me retrouve incapable de fournir.
Une de mes connaissances a établi un petit programme en Python sans appel à un quelconque GUI (tkinter ou autre) un petit programme qui fonctionne.
Il a établi une série de questions sur la 1ere déclinaison latine et une série de réponses correspondantes.
12 questions sont tirées au sort de façon à ce que 2 fois la même question dans une série ne soit pas posée...
Les réponses son traitées : Vrai -Faux et un bilan établi au terme de la série de questions.
Ce programme fonctionne tel quel même s'il est grandement améliorable au niveau code...
L'os sur lequel je bute est l'ajout d'un temps imparti pour répondre à la question et en cas de délai dépassé, arrêt du timer, génération d'une nouvelle question et redémarrage du timer.
Après recherche je suis tombé sur ce code de guigui : http://python.developpez.com/faq/ind...ad#ThreadTimer
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
# -*- coding: cp1252 -*-
import threading
import time
 
 
class MyTimer:
    def __init__(self, tempo, target, args= [], kwargs={}):
        self._target = target
        self._args = args
        self._kwargs = kwargs
        self._tempo = tempo
 
    def _run(self):
        self._timer = threading.Timer(self._tempo, self._run)
        self._timer.start()
        self._target(*self._args, **self._kwargs)
 
    def start(self):
        self._timer = threading.Timer(self._tempo, self._run)
        self._timer.start()
 
    def stop(self):
        self._timer.cancel()
 
 
def affiche(unstr):
    print unstr, time.clock()
 
a = MyTimer(1.0, affiche, ["MyTimer"])
a.start()
time.sleep(5.5)
print u"Timer arrêté"
a.stop()
time.sleep(2.0)
print u"Timer relancé"
a.start()
Ce code étant opérationnel, s'est posée la question de son adaptation aux besoins de la problématique.
J'ai essayé de procéder comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
a = MyTimer(1.0, scrute, ["Temps :"])
a.start()
ReponseUtilisateur=raw_input("Entrez votre réponse : ")
J'ai modifié le def affiche(unstr) de guigui en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
def scrute(Stop):
    temps = int(time.clock())
    if temps > 5 :
        print "Délai dépassé !"
        a.stop()
Le timer ne démarre qu'après avoir donné la réponse : là si j'attends 5 s, le message Délai dépassé apparaît.
Tout se passe donc comme si le raw_input bloquait le lancement du timer.
Il faudrait donc que fonctionnement du timer et le déroulement du programme se fasse dans 2 processus différents, non ?
Je n'ai donc finalement rien compris au fonctionnement de la classe Mytimer de guigui. Et on en revient à ce que je disais au début sur la compréhension des classes...
Je ne vois pas comment, dans l'état actuel de mes connaissances, je peux m'en sortir : je suis ouvert à toute suggestion, mercuriale, critique...

Merci d'avance