[Python 2.X] Prblème Thread + Tkinter
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:
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,