Bonjour,

Je souhaite réaliser un réseau simple entre deux utilisateurs. J'utilise un thread pour la connexion avec le client et un autre qui affiche la durée de connexion. Le problème est le suivant : lorsque la connexion entre le serveur et le client est établie, je ne peux pas utiliser un bouton sur le GUI pour faire une autre action, comme si le thread l'en empêchait.

Voici mon code côté serveur :

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
# -*- coding: cp1252 -*-
# python version 2.7.8
 
import socket,sys,ctypes,pygame,time
from Tkinter import *
from threading import Thread
 
#DIMENSIONS DE L'ECRAN
 
SM_CXSCREEN = 0
SM_CYSCREEN = 1
largeurScreen = ctypes.windll.user32.GetSystemMetrics(SM_CXSCREEN)
hauteurScreen = ctypes.windll.user32.GetSystemMetrics(SM_CYSCREEN)
largeurMain=240
hauteurMain=hauteurScreen
 
#SERVEUR
 
HOST = '192.168.0.12'
PORT = 6027
 
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
try:
     mySocket.bind((HOST, PORT))
except socket.error:
     print "La liaison du socket à l'adresse choisie a échoué."
     sys.exit()
 
 
#VARIABLES GLOBALES
 
#CLASSES
 
#thread serveur
 
class Serveur(Thread):
    """Thread chargé de se connecter au client"""
 
    def __init__(self):
        Thread.__init__(self)
 
    def run(self):
          while 1:
               #Attente de la requête de connexion d'un client :
               print "Serveur prêt, en attente de la connexion du client..."
               mySocket.listen(5)
 
               #Etablissement de la connexion :
               connexion, adresse = mySocket.accept()
               print "Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1])
               texte.set("Client connecté")
               thread_time.start()
 
               #Dialogue avec le client :
               connexion.send("Vous êtes connecté au serveur")
               msgServeur=raw_input("fin?")
               if msgServeur.upper()=="FIN" or msgServeur.upper()=="":
                    thread_time.stopthread()
                    texte.set("Client déconnecté")
                    break
          connexion.close()
          sys.exit()
 
#thread durée
 
class Duree(Thread):
    """Thread chargé d'afficher le temps écoulé"""
 
    def __init__(self):
        Thread.__init__(self)
        self.arret=False
 
    def run(self):
          try:
             while 1:
               raw_time=time.clock()
               s=int(raw_time)
               h=0
               m=0
               if s >= 60:
                 m = s//60
                 s -= m*60
               if m >= 60:
                   h = m//60
                   m -= h*60
               temps.set(str(h)+' h '+str(m)+' m '+str(s)+' s')
               if self.arret==True:
                    raise
          except:
               print "Arrêt du thread Durée Serveur"
 
    def stopthread(self):
        self.arret=True        
 
 
#DEFINITIONS
 
def quitter():
     print "quitter"
 
#PROGRAMME PRINCIPAL
 
Mafenetre=Tk()
Mafenetre.title("Collaborative Tool")
texte=StringVar()
temps=StringVar()
#Mafenetre.configure(bg="white")
Mafenetre.geometry('%dx%d+%d+%d' % (largeurMain,hauteurMain,largeurScreen-253,0))
 
thread_serveur=Serveur()
thread_time=Duree()
thread_serveur.start()
 
LabelTime=Label(Mafenetre,textvariable=temps)
LabelTime.pack()
 
LabelServeur=Label(Mafenetre,textvariable=texte)
LabelServeur.pack()
 
BoutonQuitter = Button(Mafenetre, text ='Quitter', command = quitter)
BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
 
Mafenetre.mainloop()
Merci pour votre aide,