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 :

Communication inter-processus Interface graphique - Serveur


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Communication inter-processus Interface graphique - Serveur
    Bonjour,je suis nouveau sur le forum.

    Voilà, j 'aimerais avoir un peu d'aide de votre part pour m'aider sur un probléme de multi-processus , ne comprenant pas toute la forme de celui-ci je suis un peu perdus .

    En effet j'essais de faire fonctionner au sein d 'un même script deux processus indépendant l'un de l'autre ,il y a un serveur en python et une interface graphiqure graphique affichant une grille de numéro, il est vital que j'arrive a faire fonctionner cet ensemble ,cela me permettrais d'être a la fin de mon projet informatique .

    Avant de lire le code voici quelque info sur mon code:

    Le serveur est un serveur socket , il est concu pour recevoir des socket d'un tiers , ces socket contiennent des numéros d'un loto ,de chiffre allant de 1 à 90 , ce serveur ne fait que recevoir les socket, une fois le numéro recu il renvoie le numéro sélectionné à un afficheur, il doit aussi le renvoyer sur une grille d'affichage.Vous verrez dans le code qu'il y a des paramétrage du serveur pour l'afficheur.Ce serveur n'est qu'un systéme d'envoie pour l'affichage.

    La Grille d'affichage est faite avec Tkinter , elle contient les numéros de 1 a 90 , lorsque qu'un numéro d'une des cases est sélectionnés ,celle-ci vire au rouge pour bien montrer le numéro selectionné.En bref lorque le serveur recevra un scoket avec le numéro choisi , il le renverra par la suite a la grille d'affichage qui le recevant changera la couleur de la case du numéro sélectionné.

    Pour que le tout marche ensemble dans un seul et même script, j'ai mis du multiprocessing pour que les deux programmes soivent indépendant l'un de l'autre et optimisés, probleme il n 'y a que le serveur qui se lance.... et je n'arrive pas comprendre mon erreur.

    Ensuite , il faut qu'il y' est une communication inter-processus, j'ai déjà mis les deux script séparés pour essayer une communication par socket,mais ce fût une erreur bien lourde de ma part, car déjà j'utilise les socket pour recevoir les numéros d'un tiers avec le serveurs , ca serait marcher sur la tête de ré-utiliser les socket pour une seul et même machine........donc je suis un peu perdus maintenant avec tout ca.
    Pipe m'a été conseillé pour la communication entre plusieur procéssus indépendant mais ne savant exactement comme utiliser Pipe, je suis bien bloqué.....

    Bon pour que vous compreniez mieux ce que je souhaite exactement je vous montre le code :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    ##!/usr/bin/python
    # -*- coding: utf-8 -*-
    #Création Serveur en python
    #Création appli_graphique avec Tkinter
     
    from Tkinter import *
    import tkMessageBox
    import time
    import socket,sys,platform,subprocess,serial
    import multiprocessing
    from multiprocessing import Process, Pipe 
     
     
    def appgraphique():
     
    	window = Tk()
    	window.title('Grille du Loto')
    	width, height = window.winfo_screenwidth(), window.winfo_screenheight()
    	window.overrideredirect(1)
    	window.geometry("%dx%d+0+0" % (width, height))
    	w = Canvas(window, width=width, height=height-20, bg='black')
     
     
    	def Affiche(): tkMessageBox.showinfo("Fichier","Aucun Fichier pour le moment")
    	def Affiche(): tkMessageBox.showinfo("Enregistrer","Aucun Enregistrement")
    	def About(): tkMessageBox.showinfo("A propos","Version 1.0")
     
     
    	def Affichegrille(nombre):
     
    		#print str(width) + " " + str(height)
     
    		h= (height-20)/9
    		larg=(width-20)/10
    		for i in range (0,10) :
    			for j in range (0,11):
    				if(nombre == ((i-1)*10+j)):
    					w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="red")
    					w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Purisa",54),fill="white")
    				else:
     
    					w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="grey")
    					w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Purisa",54),fill="white")
     
     
    		w.pack() 
     
    	mainmenu = Menu(window)
    	menu1 = Menu(mainmenu)
    	menu1.add_command(label="Quitter", command=window.quit)
     
    	menuHelp = Menu(mainmenu) ## Menu Fils 
    	menuHelp.add_command(label="A propos", command=About) 
     
    	mainmenu.add_cascade(label = "Options", menu=menu1) 
    	mainmenu.add_cascade(label = "Aide", menu=menuHelp) 
    	window.config(menu = mainmenu) 
    	Affichegrille(6)
     
    	mainloop()
     
     
    def serveur():
     
    	IP = "192.168.0.103" #Adresse du serveur
    	PORT = 10500  # Port de Connexion du Serveur
    	counter =0 #Compteur de connexion
    	host = socket.gethostname()
    	NomOS = platform.system() #subprocess.call(['./trame_afficheur.py'])
    	#with open ("numero.txt", "r") as myfile:
    	#    data=myfile.read().replace('\n', '')
     
    	trame=str()
    	trame_debut=str("\x02001\x1D001\x1D")
    	trame_message=str("birnve,nur") 
    	trame_fin=str("\x03")
    	trame_affiche=str("\x01001\x1D001\x04")
     
    	ser=serial.Serial(
    	        port='/dev/ttyUSB0',
    	        baudrate=9600,
    	        parity=serial.PARITY_NONE,
    	        stopbits=serial.STOPBITS_ONE,
    	        bytesize=serial.EIGHTBITS
    	)
     
    	serveur_loto_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Serveur Socket
     
    	print "Ecoute du port : " + str(PORT)
    	print ("Démarrage...")
     
    	try:
    		serveur_loto_socket.bind((IP, PORT)) #Fonction Bind association d'un socket avec une adresse ou un port donnée
     
    	except socket.error :
    		print "Echec.Erreur" + str(socket.error)
    		sys.exit 
     
    	print "Nom de la machine :",host
    	print "OS: ", NomOS
     
    	#open('numero.txt', 'w').close()
    	# Mise en Attente du socket// Attente de la requête
     
    	print("Serveur en marche...Attente de requêtes.....")
     
     
    	serveur_loto_socket.listen(2)
     
    	connexion, adr = serveur_loto_socket.accept()
    	counter +=1
    	print "Nombre de connexions : ",counter
    	print ("Client connecté, adrese IP %s , port %s" % (adr[0], adr[1]))
     
     
    	while 1:
    		# Mise en Attente du socket// Attente de la requête
     
     
     
    		#etablissement d'une connection 
    		#Acceptation de la connection
     
    		#counter +=1
     
    		#print "Nombre de socket:",counter
    		#print("Client connecté, adresse IP %s, port %s" % (adr[0], adr[1]))
    		data = connexion.recv(4)
     
    		if(data=="0"):
    			#counter =0
    			#data = "arret du tirage             "
    			print "arrete"
    			trame_message  = "ARRET DU    TIRAGE      "
     
    			trame=trame_debut+trame_message+trame_fin
     
    			ser.write(trame)
     
    			ser.write(trame)
     
    			ser.write(trame_affiche)
    		else:	
     
    			#Affichegrille(data)
    			serveur_loto_socket.connect('tcp:127.0.0.1:5000')
    			serveur_loto_socket.sendto(data,'127.0.0.1:5000')
     
    			print "recu du message:", data
     
    			trame_message = "Num:" +data+ "               "
    			trame = trame_debut + trame_message + trame_fin
     
    			ser.write(trame)
     
    			ser.write(trame)
     
    			ser.write(trame_affiche)
     
     
    	print("Fin de Connexion...")
    	#ser.close()
     
    	#connexion.close()
     
     
     
    #com_process=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #com_process.bind(serveur,appgraphique)
    #com_process.
     
     
    Mon_serveur = multiprocessing.Process(target=serveur)
    Mon_application = multiprocessing.Process(target=appgraphique)
     
    Mon_serveur.start()
    Mon_application.start()
     
    Mon_serveur.join()
    Mon_application.join()
    Image de la grille :
    Nom : Capture du 2015-03-26 08:36:36.png
Affichages : 300
Taille : 124,9 Ko

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Peut être que l'exemple du jeu de bombardes en réseau donné dans le Swinnen vous donnera quelques idées (non pas sur votre problème mais sur comment construire ce genre d'application).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    D'accord je vas essayer de voir comment je peux faire , si je trouve une solution ou une alternative je la posterais.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Bonjour ,bon me revoilà aprés une semaine d'exam j 'ai travailler un peu sur mon projet ,j'ai decider de recréer un serveur pour mon appli graphique , elle sera donc utilisé sur une autre machine....

    J'ai quelque soucis lorsque j'essai d'envoyer des donnée les cases des numéros selectionnées ne change pas de couleur.....

    Voici le bout de code de mon appli graphique:
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    ##!/usr/bin/python
    # -*- coding: utf-8 -*-
    #Création Serveur en python
    #Création appli_graphique avec Tkinter
     
    from Tkinter import *
    import tkMessageBox
    import time
    import socket,sys,platform
     
    IP = "192.168.0.16" #Adresse du serveur
    PORT = 5000  # Port de Connexion du Serveur
    host = socket.gethostname()
    NomOS = platform.system() 
     
    serveur_loto_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Serveur Socket
     
    print "Ecoute du port : " + str(PORT)
     
    try:
    	serveur_loto_socket.bind((IP, PORT)) #Fonction Bind association d'un socket avec une adresse ou un port donnée
     
    except socket.error :
    	print "Echec.Erreur" + str(socket.error)
    	sys.exit 
     
    print "Nom de la machine :",host
    print "OS: ", NomOS
     
    print "Ecoute du port : " + str(PORT)
    serveur_loto_socket.listen(2)
     
    connexion, adr = serveur_loto_socket.accept()
    print ("Client connecté, adrese IP %s , port %s" % (adr[0], adr[1]))
     
    window = Tk()
    window.title('Grille du Loto')
    width, height = window.winfo_screenwidth(), window.winfo_screenheight()
    window.overrideredirect(1)
    window.geometry("%dx%d+0+0" % (width, height))
    w = Canvas(window, width=width, height=height-20, bg='black')
     
     
    def Affiche(): tkMessageBox.showinfo("Fichier","Aucun Fichier pour le moment")
    def Affiche(): tkMessageBox.showinfo("Enregistrer","Aucun Enregistrement")
    def About(): tkMessageBox.showinfo("A propos","Version 1.0")
     
    mainmenu = Menu(window)
    menu1 = Menu(mainmenu)
    menu1.add_command(label="Quitter", command=window.quit)
     
    menuHelp = Menu(mainmenu) ## Menu Fils 
    menuHelp.add_command(label="A propos", command=About) 
     
    mainmenu.add_cascade(label = "Options", menu=menu1) 
    mainmenu.add_cascade(label = "Aide", menu=menuHelp) 
    window.config(menu = mainmenu) 
     
    def Affichegrille(nombre):
     
     
    	h= (height-20)/9
    	larg=(width)/10
    	for i in range (0,10) :
    		for j in range (0,11):
    			if(nombre == ((i-1)*10+j)):
    				w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="red")
    				w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Purisa",54),fill="white")
    			else:
    				w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="grey")
    				w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Purisa",54),fill="white")
     
    	w.pack() 
     
    while 1:
     
    	data = connexion.recv(4)
     
    	if (data == "0"):
     
    		print "pas de numero"
    		sys.exit
     
    	else:
     
    		print data
     
    		Affichegrille(data)
     
    	mainloop()

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    "if(nombre == ((i-1)*10+j)):" suppose que nombre est un entier alors qu'il n'est que bytes: la condition sera toujours False.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Voilà grâce a ce que tu m'a dit j'ai pu corrigé une partie du probléme d'affichage.

    Lorsque je sélectionne un numéro la case de celui-ci, elle change bien de couleur passant du gris au rouge , parcontre lorssque je veux reactualiser la grille pour afficher le numéro suivant selectionné j'ai du bidouller avec un bouton qui actualise la grille ,seulment comme c 'est un serveur qui tourne en continu j'aimerais que ma grille se reactulise automatiquement dés qu'un nouveau numéro est choisi .

    Y a bien le time.sleep que j'ai éssayé mais celui-ci ne marche pas comme je le souhaite..

    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
    75
    76
    77
    78
    79
    ##!/usr/bin/python
    # -*- coding: utf-8 -*-
    #Création Serveur en python
    #Création appli_graphique avec Tkinter
     
    from Tkinter import *
    import tkMessageBox
    import time
    import socket,sys,platform
     
    IP = "192.168.0.16" #Adresse du serveur
    PORT = 5000  # Port de Connexion du Serveur
    host = socket.gethostname()
    NomOS = platform.system() 
     
    serveur_loto_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Serveur Socket
     
    print "Ecoute du port : " + str(PORT)
     
    try:
    	serveur_loto_socket.bind((IP, PORT)) #Fonction Bind association d'un socket avec une adresse ou un port donnée
     
    except socket.error :
    	print "Echec.Erreur" + str(socket.error)
    	sys.exit 
     
    print "Nom de la machine :",host
    print "OS: ", NomOS
     
    print "Ecoute du port : " + str(PORT)
    serveur_loto_socket.listen(2)
     
    connexion, adr = serveur_loto_socket.accept()
    print ("Client connecté, adrese IP %s , port %s" % (adr[0], adr[1]))
     
     
    window = Tk()
    window.title('Grille du Loto')
    width, height = window.winfo_screenwidth(), window.winfo_screenheight()
    window.overrideredirect(1)
    window.geometry("%dx%d+0+0" % (width, height))
    w = Canvas(window, width=width, height=height-20, bg='black')
     
    def Affichegrille(nombre):
     
     
     
    	h= (height-20)/9
    	larg=(width)/10
     
    	for i in range (0,10) :
    		for j in range (0,11):
    			if(int(nombre) == ((i-1)*10+j)):
    				w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="red")
    				w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Arial",60),fill="white")
    			else:
    				w.create_rectangle((j-1)*larg,(i-1)*h,(j)*larg,(i)*h,fill="grey")
    				w.create_text((j-0.5)*larg,(i-0.5)*h,text=str((i-1)*10+j),font=("Arial",60),fill="white")
    	w.pack() 
     
     
    refresh=Button(window, text='Refresh', command = window.quit)
    refresh.pack()
     
     
    while 1:
     
    	data = connexion.recv(4)
     	if (data == "0"):
     
    		print "pas de numero"
     
    	else:
     
    		print data
     
    		Affichegrille(data)
     
    	mainloop()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Outre la lecture précédemment mentionnée:
    Citation Envoyé par wiztricks Voir le message
    Peut être que l'exemple du jeu de bombardes en réseau donné dans le Swinnen vous donnera quelques idées (non pas sur votre problème mais sur comment construire ce genre d'application).
    Pour ce qui est de :
    parcontre lorssque je veux reactualiser la grille pour afficher le numéro suivant selectionné j'ai du bidouller avec un bouton qui actualise la grille ,seulment comme c 'est un serveur qui tourne en continu j'aimerais que ma grille se reactulise automatiquement dés qu'un nouveau numéro est choisi .
    Pourquoi ne pas commencer par actualiser la grille à partir d'une saisie de l'utilisateur?
    Ça retire les complications "réseau" pour seulement changer l'état du rectangle correspondant au numéro saisi.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Communication inter-processus et pause()
    Par jsebfranck dans le forum POSIX
    Réponses: 10
    Dernier message: 14/02/2008, 14h52
  2. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  3. [Perl] communication Inter-Processus
    Par MarneusCalgarXP dans le forum Langage
    Réponses: 15
    Dernier message: 14/08/2006, 22h43
  4. [débutant] Communication inter-processus
    Par tooney dans le forum C
    Réponses: 3
    Dernier message: 29/12/2005, 20h48
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

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