OVH Cloud OVH Cloud

Débutant - Threads, Ping et Tk

3 réponses
Avatar
lav
Bonjour à vous,

je débute en Python et franchement je dois dire que la programmation me
plait beaucoup, surtout quand les choses semblent abordales comme avec
Python.

Voilà, en premier projet, je me suis donné le but de faire un programme
qui ping 3 adresses les unes après les autres.
Jusque là, j'ai réussi à faire quelque chose, bien qu'utiliser le ping de
l'os ne soit pas bien en terme de portabilité. Je regarderai
ultérieurement comment faire ma propre requête ICMP et exploiter le
résultat.
Au même moment que les pings se déroulent, je dois avoir une fenêtre
créée à partir de Tk.

En fonction des pings, l'information dans la fenêtre doit changer ou pas.

Mes deux questions sont:
- Vu qu'il y a deux processus qui se lancent simultanénement (la fenêtre
Tk et la série des 3 pings), je pense devoir utiliser les Threads. Je me
trompe ? Y a t'il un moyen plus simple?
- Comment faire pour 'camoufler' les informations affichées dans le
terminal ou la fenêtre dos par ma commande 'if os.system('ping -n 2 '
+gwip):' ?

Merci,
Franck



--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/

3 réponses

Avatar
lav
Le Thu, 29 Jun 2006 13:48:20 +0200, lav a écrit:

Finalement, en utilisant le module pingNode ça va un peu mieux.
Voici le code que j'utilise... attention, il va piquer les yeux à certains
:D

import os
import sys
from Tkinter import *
from ping2 import pingNode
from time import sleep
import threading

ipgw = "192.168.0.1"
ipdns = "212.27.53.252"
ipfinal = "www.google.fr"

#gestion des erreurs
errorNo = "Reseau Ok"
errorGw = "Routeur inacessible"
errorDns = "Probleme dns"
errorRtg = "Probleme de routage"


racine = Tk()
affichage = Label(text=errorNo)

def wdw():
affichage.pack();
racine.mainloop()

def checknode():
while 1:
while 1:

try:
if pingNode(alive=1,node=ipgw) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorGw)
return 0

try:
if pingNode(alive=1,node=ipdns) != FALSE:
affichage.config(text=errorNo)
else:
affichage.config(text=errorRtg)
return 0
except:
affichage.config(text=errorRtg)
return 0

try:
if pingNode(alive=1,node=ipfinal) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorDns)
return 0
sleep(5)

def chkfinal():
while 1:
if checknode() == 0:
checknode()

t1 = threading.Thread(target=wdw)
t2 = threading.Thread(target=chkfinal)
t1.start()
t2.start()


j'avais prévenu, m'enfin ça marche... :D

Maintenant ma question est:
- comment camoufler la fenêtre dos qui tourne derrière? je ne voudrais
voir uniquement que ma fenêtre Tk()

Merci à vous,
Franck

Bonjour à vous,

je débute en Python et franchement je dois dire que la programmation
me plait beaucoup, surtout quand les choses semblent abordales comme
avec Python.

Voilà, en premier projet, je me suis donné le but de faire un
programme qui ping 3 adresses les unes après les autres.
Jusque là, j'ai réussi à faire quelque chose, bien qu'utiliser le ping
de l'os ne soit pas bien en terme de portabilité. Je regarderai
ultérieurement comment faire ma propre requête ICMP et exploiter le
résultat.
Au même moment que les pings se déroulent, je dois avoir une fenêtre
créée à partir de Tk.

En fonction des pings, l'information dans la fenêtre doit changer ou
pas.

Mes deux questions sont:
- Vu qu'il y a deux processus qui se lancent simultanénement (la
fenêtre Tk et la série des 3 pings), je pense devoir utiliser les
Threads. Je me trompe ? Y a t'il un moyen plus simple?
- Comment faire pour 'camoufler' les informations affichées dans le
terminal ou la fenêtre dos par ma commande 'if os.system('ping -n 2 '
+gwip):' ?

Merci,
Franck







--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/

Avatar
Eric Brunel
On Fri, 30 Jun 2006 00:04:46 +0200, lav wrote:

Le Thu, 29 Jun 2006 13:48:20 +0200, lav a écrit:

Finalement, en utilisant le module pingNode ça va un peu mieux.
Voici le code que j'utilise... attention, il va piquer les yeux à
certains :D

import os
import sys
from Tkinter import *
from ping2 import pingNode
from time import sleep
import threading

ipgw = "192.168.0.1"
ipdns = "212.27.53.252"
ipfinal = "www.google.fr"

#gestion des erreurs
errorNo = "Reseau Ok"
errorGw = "Routeur inacessible"
errorDns = "Probleme dns"
errorRtg = "Probleme de routage"


racine = Tk()
affichage = Label(text=errorNo)

def wdw():
affichage.pack();
racine.mainloop()

def checknode():
while 1:
while 1:

try:
if pingNode(alive=1,node=ipgw) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorGw)
return 0

try:
if pingNode(alive=1,node=ipdns) != FALSE:
affichage.config(text=errorNo)
else:
affichage.config(text=errorRtg)
return 0
except:
affichage.config(text=errorRtg)
return 0

try:
if pingNode(alive=1,node=ipfinal) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorDns)
return 0
sleep(5)

def chkfinal():
while 1:
if checknode() == 0:
checknode()

t1 = threading.Thread(target=wdw)
t2 = threading.Thread(target=chkfinal)
t1.start()
t2.start()


j'avais prévenu, m'enfin ça marche... :D


Malheureusement, c'est peut-être un hasard... Le problème est que, comme
la plupart des toolkits GUI, Tkinter n'aime pas beaucoup être accédé via
des threads secondaires. Il est possible qu'à terme, tu aies des erreurs
étranges, voire même des crashs. Si c'est le cas, il est possible que tu
doives organiser les choses autrement, de façon à n'accéder aux objets
Tkinter que dans le thread dans lequel la mainloop est lancée (t1 donc).
En clair, cela veut dire générer des événements personnalisés dans les
autres threads (via la méthode event_generate des widgets Tkinter) et les
traiter dans le thread de la mainloop via des bindings sur les widgets
(méthode bind). Si tu en arrives là, je pourrais te donner plus de
précisions sur tout ça.

Maintenant ma question est:
- comment camoufler la fenêtre dos qui tourne derrière? je ne voudrais
voir uniquement que ma fenêtre Tk()


Ca, c'est facile: renomme ton fichier .py en .pyw et la fenêtre DOS ne
devrait plus apparaître.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
lav
Le Fri, 30 Jun 2006 09:28:09 +0200, Eric Brunel
a écrit:


Bonjour Eric et merci beaucoup pour la réponse.
Je me penche sur la question de suite


On Fri, 30 Jun 2006 00:04:46 +0200, lav wrote:

Le Thu, 29 Jun 2006 13:48:20 +0200, lav a
écrit:

Finalement, en utilisant le module pingNode ça va un peu mieux.
Voici le code que j'utilise... attention, il va piquer les yeux à
certains :D

import os
import sys
from Tkinter import *
from ping2 import pingNode
from time import sleep
import threading

ipgw = "192.168.0.1"
ipdns = "212.27.53.252"
ipfinal = "www.google.fr"

#gestion des erreurs
errorNo = "Reseau Ok"
errorGw = "Routeur inacessible"
errorDns = "Probleme dns"
errorRtg = "Probleme de routage"


racine = Tk()
affichage = Label(text=errorNo)

def wdw():
affichage.pack();
racine.mainloop()

def checknode():
while 1:
while 1:

try:
if pingNode(alive=1,node=ipgw) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorGw)
return 0

try:
if pingNode(alive=1,node=ipdns) != FALSE:
affichage.config(text=errorNo)
else:
affichage.config(text=errorRtg)
return 0
except:
affichage.config(text=errorRtg)
return 0

try:
if pingNode(alive=1,node=ipfinal) != FALSE:
affichage.config(text=errorNo)
except:
affichage.config(text=errorDns)
return 0
sleep(5)

def chkfinal():
while 1:
if checknode() == 0:
checknode()

t1 = threading.Thread(target=wdw)
t2 = threading.Thread(target=chkfinal)
t1.start()
t2.start()


j'avais prévenu, m'enfin ça marche... :D


Malheureusement, c'est peut-être un hasard... Le problème est que, comme
la plupart des toolkits GUI, Tkinter n'aime pas beaucoup être accédé via
des threads secondaires. Il est possible qu'à terme, tu aies des erreurs
étranges, voire même des crashs. Si c'est le cas, il est possible que tu
doives organiser les choses autrement, de façon à n'accéder aux objets
Tkinter que dans le thread dans lequel la mainloop est lancée (t1 donc).
En clair, cela veut dire générer des événements personnalisés dans les
autres threads (via la méthode event_generate des widgets Tkinter) et
les traiter dans le thread de la mainloop via des bindings sur les
widgets (méthode bind). Si tu en arrives là, je pourrais te donner plus
de précisions sur tout ça.

Maintenant ma question est:
- comment camoufler la fenêtre dos qui tourne derrière? je ne voudrais
voir uniquement que ma fenêtre Tk()


Ca, c'est facile: renomme ton fichier .py en .pyw et la fenêtre DOS ne
devrait plus apparaître.

HTH




--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/