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 :

threading.Timer stopper avec ouverture de fenetre


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut threading.Timer stopper avec ouverture de fenetre
    Bonjour,

    Je cale un peu sur un petit problème.
    En fait j'ai une fonction qui tourne en boucle toutes les x secondes pour pinguer un serveur et si celui-ci ne répond plus j'ouvre une fenêtre où l'utilisateur peut encoder quelque chose qui est sauvé avec l'heure système.
    Pour faire ça pas de problèmes mais le problème est que quand la fenêtre s'ouvre, la fonction arrête de pinguer en boucle

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    def MyTimer(isOpen,tempo = float(time)):
     
        #si linux   
        if sys.platform == "linux2":
            lPing = subprocess.Popen(["ping","-c", "1 ", ip ],  
    					    stdout = subprocess.PIPE, 
    					    stderr = subprocess.PIPE) 
        elif sys.platform == "win32":
            lPing = subprocess.Popen(["ping","-n", "1 ", ip ],  
    					    stdout = subprocess.PIPE, 
    					    stderr = subprocess.PIPE) 
     
        sLigne, erreur = lPing.communicate()
        print sLigne
        #si linux   
        if sys.platform == "linux2":
            info_reg = info_reg = re.search(r'(\d+) packets transmitted',sLigne,re.M)
            transmis = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'(\d+) received',sLigne,re.M)
            received = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'(\d+)% packet loss',sLigne,re.M)
            loss = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'time (\d+)ms',sLigne,re.M)
            time = int(info_reg.group(1))
     
        now = datetime.datetime.now()
        #si l'expression régulière a donné un résultat
        if transmis > 0:
            isDown = False
            if received == 0:
                isDown = True
    	    #si le serveur répond après avoir été down et qu'il y a un fichier à uploader alors upload
    	    #recupere les parametres du fichier 
            if isDown == 'False':
                isOpen = False
                if(os.path.exists(pathLoc) and os.path.getsize(pathLoc) > 0):
                    transport = paramiko.Transport((ip, port)) 
                    transport.connect(username = user, password = passwd) 
                    sftp = paramiko.SFTPClient.from_transport(transport) 
                    sftp.put(pathLoc,pathServ) 
                    sftp.close() 
                    transport.close() 
                    #print 'Upload done.' 
                    os.remove(pathLoc)                  #supprime fichier
            else:
    	        if(received == 0 and isOpen == False):
    	            print now.strftime("%d/%m/%YT%H:%M:%S")
    	            fen_matricule(racine)
    	            isOpen = True
        else:
            received = 0
            if(received == 0 and isOpen == False):
                print now.strftime("%d/%m/%YT%H:%M:%S")
                fen_matricule(racine)
                isOpen = True
     
        threading.Timer(tempo, MyTimer, [isOpen,tempo]).start()
     
    def fen_matricule(racine):
     
    	fond=Tkinter.Canvas(racine, width=300, height=200, background='darkgray')
    	fond.pack()
    	texte=Tkinter.Label(fond, text="Matricule", fg="black")
    	texte.pack(side=Tkinter.LEFT)
    	valsaisir=Tkinter.StringVar() #variable to get value
    	saisie=Tkinter.Entry(textvariable=valsaisir, width=30)
    	saisie.pack()
    	bouton=Tkinter.Button(racine, text="OK", command=lambda: save(valsaisir.get(),racine,saisie)).pack(side=Tkinter.BOTTOM)
    	"""
            bouton=Tkinter.Button(racine, text="Quitter", command=racine.quit)
            bouton.pack(side=Tkinter.BOTTOM)
            """
    	racine.mainloop()
    	MyTimer(isOpen,float(time))
    J'ai besoin que ça continue de pinguer tout en laissant cette fenêtre ouverte et si il répond de nouveau je ferme la fenêtre et préviens l'utilisateur que le serveur est de nouveau dispo


    Merci de votre aide

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    mainloop() est bloquant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    root = Tkinter.Tk()
    print 'avant mainloop'
    root.mainloop()
    print 'apres mainloop'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            if(received == 0 and isOpen == False):
                print now.strftime("%d/%m/%YT%H:%M:%S")
                fen_matricule(racine)
    Lorsque vous utilisez le module threading avec Tkinter vous devez bien séparer les deux et faire en sorte que threading ne modifie pas directement l'interface graphique.

    @+

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Quelques notes:

    Attention à l'indentation : 4 espaces et non tabulation. Surtout pas de mélange, ce qui est le cas dans votre code.

    Pourquoi utiliser un Canvas comme conteneur ? racine est suffisant.

    Je ne vois pas trop l'utilité de la classe Variable ici. Un simple saisie.get() est suffisant.

    Quel intérêt de sauvegarder des instances ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    save(valsaisir.get(),racine,saisie)
    Vous avez regrouper ce que vous aviez appris lors de vos précédentes questions et c'est bien. Mais les 'briques' ne sont pas dans le bon sens.

    @+

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Tout d'abord merci de tes réponses et de remarquer que le forum porte ses fruits avec un noob comme moi

    1) je passe saisie à la fonction save pour pouvoir remettre à vide le textbox de la popup. Je n'ai effectivement pas besoin de passer racine

    2)Je ne comprends pas en quoi mes briques sont dans le mauvais ordre

    3)Comment faire pour que le lancement de ma fenêtre n'affecte pas mon thread qui vas pinguer le serveur

    Je débute donc je galère

    Merci

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Je pense avoir compris pourquoi mes briques sont dans le mauvais ordre.
    Il faudrait qu'en premier je lance l'application mais que la fenêtre soit cachée
    et à coté de ça je lance mon thread qui ping et une fois que le serveur ne répond plus, je rend visible la fenêtre.

    J'ai bien compris? par contre pour l'appliquer

    Merci

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Je vous donne l'exemple dans une autre de vos questions: .withdraw()/.deiconify()
    Le plus simple c'est de créer la fenêtre (racine = Tkinter.Tk()), lancer le thread puis de mettre l'event loop (racine.mainloop())
    Il ne vous reste plus qu'a faire 'communiquer' les deux.
    Attention:
    Comme je le dis plus haut il est déconseillé de modifier l'interface graphique directement à partir du thread.
    Évitez aussi d'utiliser la classe Variable Tkinter pour faire un callback (Mais l'idée c'est bien un callback ).

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouverture nouvelle fenetre avec method POST
    Par jeeps64 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/04/2012, 17h11
  2. threading.Timer stopper avec ouverture de fenetre
    Par bender86 dans le forum Tkinter
    Réponses: 0
    Dernier message: 31/07/2011, 14h29
  3. [WD12] Ouverture de fenetres avec tables
    Par PAUL87 dans le forum WinDev
    Réponses: 19
    Dernier message: 29/01/2010, 13h48
  4. probleme d'ouverture de fenetre avec visual studio
    Par saifoune dans le forum Visual Studio
    Réponses: 0
    Dernier message: 02/04/2009, 15h33
  5. [TP]Liaison série avec TP7 dans fenêtre DOS W2000
    Par Alain81 dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 14/06/2003, 00h43

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