l'équipe avec qui je travaille a émit le souhait d'avoir un "système d'alerte" sur pc. Nous travaillons sur un site étendu ou il n'y a pas toujours quelqu’un avec soit et nous ne savons pas toujours ou sont les gens. Alors je me suis fixé comme projet de développer un truc en python car c'est la base commune à nos diverses configurations. J'ai dans l'idée d'avoir une fenêtre TK dans laquelle il y a trois boutons : ALARME, reset et Quitter. Jusque là rien de Dantesque. La ou ca coince c'est que je veux mettre en oeuvre dans une seule fenêtre des sockets en UDP en serveur et client. L'idée c'est que le script puisse servir sans paramétrage sur n'importe quelle pc du parc et que quand on clique sur "alarme" ca ouvre une fenetre dans toutes les machines qui ont le soft. Mais, oui je sais ,mais un je ne suis qu'un piètre développeur, le projet n'est pas super simple et .... Bon il y a des choses qui tournent quand même. J'arrive a envoyer une trame en broadcast et ca ouvre une fentre. malgrès tout ce n'est pas stable. Bref si une ame charitable pouvait jeter un oeil et me dire comment sortir de cette galère ca serait cool.
Cordialement FX
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from Tkinter import *
import os, time
import socket, threading
from time import gmtime, strftime
UDP_IP = "192.168.1.255" # adresse a adapter en fonction du réseau
UDP_IP_LOC = socket.gethostbyname(socket.gethostname())
UDP_PORT = 5025
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sockA = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
def nouvelle_fenetre (): # ouverture de la fenetre fille en local
global op
if op < 1:
print "NF -> op = ", op #debbug
MESSAGE = "HELP !!! "+ "\n" + socket.getfqdn() + "\n" + strftime("%d %b %Y \n %H:%M:%S GMT", gmtime()) #" " + socket.gethostbyname(socket.gethostname()) +
#Label(fenetre_fille,bg='yellow', font="courier 60 bold",text=MESSAGE).pack(pady=300, padx=50)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
#sockA.close()
else:
print "fenetre deja ouverte, op = ", op
return
def fermer_fenetre (): # fermeture de fenetre fille
global op
if op > 0:
global fenetre_fille
op = 0
fenetre_fille.destroy()
print "ff -> op = ", op # debbug
else:
print "pas de fenetre fille ouverte, valeur op : ", op # debbug
return
def server(): # ouverture de la fenetre fille depuis le reseau
global op
print "server avant -> op = ",op
if op < 1:
#sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP_LOC, UDP_PORT)) # serve clients in threads
while 1:
data, addr = sock.recvfrom(256) # buffer size is 1024 bytes
print "received message:", data # debbug
global fenetre_fille
op = 2
print "server apres -> op = ",op
fenetre_fille = Toplevel(background='red')
Label(fenetre_fille,bg='yellow', font="courier 60 bold",text=data).pack(pady=300, padx=50)
#data=""
else:
print "debbug fentre ouverte via le LAN, op = ",op
return
def fermer_appli ():
sock.close()
#sockA.close()
fenetre.quit()
fenetre = Tk()
#fenetre.title("Help me !!! ")
op = 0
print "start appli -> op = ", op
Button(fenetre, bg="red", text="ALARM", command=nouvelle_fenetre).pack(pady=5, padx=10)
Button(fenetre, bg="green", text="Reset" , command=fermer_fenetre).pack(pady=5)
Button(fenetre, text="Close", command=fermer_appli).pack(pady=5)
threading.Thread(target=server).start()
fenetre.mainloop()
bon j'ai avancé mais, ca bug quand je veux quitter l'appli, je ne parviens pas a stopper le thread pour fermer l'appli. Si quelqu'un a une idée de la chose je sis preneur.
Merci d'avance
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from Tkinter import *
import os, time
import socket, threading
from time import gmtime, strftime
#UDP_IP = "192.168.1.255" # adresse a adapter en fonction du réseau
UDP_IP = "127.0.0.1" # adresse a adapter en fonction du réseau
UDP_IP_LOC = "localhost"
UDP_PORT = 5025
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sockA = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
op = 0
class applicatif(Tk):
def __init__(self):
Tk.__init__(self)
self.title("Help me !!! ")
print "start appli -> op = ", op
Button(self, bg="red", text="ALARM", command=self.nouvelle_fenetre).grid(row = 1,column=0,padx=10,pady=10)
Button(self, bg="green", text="Reset" , command=self.fermer_fenetre).grid(row = 1,column=5,padx=10,pady=10)
#Button(self, text="Close", command=self.fermer_appli).grid(row=1, column=10,padx=10,pady=10)
Button(self, text="Close", command=self.quit).grid(row=1, column=10,padx=10,pady=10)
def nouvelle_fenetre (self): # ouverture de la fenetre fille en local
global op
if op < 1:
op = 1
print "NF -> op = ", op #debbug
MESSAGE = "HELP !!! "+ "\n" + socket.getfqdn() + "\n" + strftime("%d %b %Y \n %H:%M:%S") #" " + socket.gethostbyname(socket.gethostname()) +
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
else:
print "fenetre deja ouverte, op = ", op
return
def fermer_fenetre (self): # fermeture de fenetre fille
global op
if op > 0:
global fenetre_fille
fenetre_fille.destroy()
op = 0
print "ff -> op = ", op # debbug
else:
print "pas de fenetre fille ouverte, valeur op : ", op # debbug
return
def arret_appli(self):
th_R.stop()
#ThreadReception.sock.close()
app.quit
class ThreadReception(threading.Thread):
"""objet de gestion de reception des alertes"""
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global op
print "server avant -> op = ",op
if op < 1:
#sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP_LOC, UDP_PORT)) # serve clients in threads
while 1:
data, addr = sock.recvfrom(256) # buffer size is 1024 bytes
print "received message:", data # debbug
global fenetre_fille
op = 2
print "server apres -> op = ",op
fenetre_fille = Toplevel(background='red')
Label(fenetre_fille,bg='yellow', font="courier 60 bold",text=data).pack(pady=200, padx=150)
else:
print "debbug fentre ouverte via le LAN, op = ",op
return
if __name__ == '__main__':
app =applicatif()
th_R = ThreadReception()
th_R.start()
app.mainloop()
Merci pour avoir pris le temps de regarder. Je cherche juste a faire du broadcast avec un message vers plusieurs pc pour demander de l'aide sur sur site ou il y a pas d'endroit isolés sans moyens de com, si se n'est un certain nombre de pc sur le même reseau, dans le message se trouve le pc émetteur, le jour et la date. C'est pour ca que j'ai monté ca comme ce. C'est presque bon sauf que je ne parviens pas a clore l'appli a cause de ma mauvaise gestion du thread et je n'arrive pas a fermer la fenetre pour réarmer le system.
Tu dois créer un Thread pour l'envoi et un autre pour la réception.
J'aurais travaillé avec un serveur centralisé qui contient une liste des IP. Mais sinon, dans le même style, tu crées une liste avec toutes les IP et tu fais un "sento" avec toute ta liste
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.