Partage
  • Partager sur Facebook
  • Partager sur Twitter

Incompréhension Thread sous Tk

    9 février 2017 à 19:20:05

    Bonjour,

    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() 



    • Partager sur Facebook
    • Partager sur Twitter
    Cordialement FX ;op -fixair.org/318
      15 février 2017 à 13:41:09

      Ola,

      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() 
      	
      • Partager sur Facebook
      • Partager sur Twitter
      Cordialement FX ;op -fixair.org/318
      Anonyme
        15 février 2017 à 15:16:29

        Bizarre je ne vois pas l'utilisation de la méthode listen et accept ?
        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2017 à 17:47:58

          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.
          • Partager sur Facebook
          • Partager sur Twitter
          Cordialement FX ;op -fixair.org/318
            15 février 2017 à 19:56:19

            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 ;)

            • Partager sur Facebook
            • Partager sur Twitter
              16 février 2017 à 9:04:00

              Merci pour ta réponse, je regarde de ce coté :op

              en fait , ce n'est pas la bonne piste car la demande peut venir de n'importe ou et non d'un seul et même pc

              -
              Edité par fx1 16 février 2017 à 16:04:50

              • Partager sur Facebook
              • Partager sur Twitter
              Cordialement FX ;op -fixair.org/318

              Incompréhension Thread sous Tk

              × 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.
              • Editeur
              • Markdown