Binder un événement socket dans Tkiner
Bonjour,
Je suis nouveau dans ce forum ET en Python. J'ai lu les 32 premières pages du forum pour trouver ma réponse, sans succès.
Voilà mon problème :
Dans le cadre d'un petit jeu avec client/serveur, je veux que mon client réagisse à l'arrivée d'un message du serveur.
Lorsque j'utilise mon recv(), la mainloop se bloque (évidemment).
Comment créer une fonction callback qui se lancerait en réaction à mon event du type "un message du serveur est en attente de lecture" ?
Je vous joins un version minimisée de mon code :
Elle contient un simple bouton, qui a pour fonction de :
- executer des trucs
- désactiver le bouton (le temps que l'adversaire joue)
- capter la réponse du serveur (sans bloquer tkinter)
- réactiver le bouton pour que le joueur puisse à nouveau jouer.
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
|
import socketfrom tkinter import *
def nord():
def wrapper():
boutonNord.config(state = "disabled")
connexion_avec_serveur.recv(1)
boutonNord.config(state = "normal")
return wrapper
hote = "localhost"
port = 12800
connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while 1:
try:
connexion_avec_serveur.connect((hote, port))
break
except socket.error:
print("J'y arrive pô !!")
print("Connexion établie avec le serveur sur le port {}".format(port))
fJeu = Tk()
boutonNord = Button(fJeu, state = "normal", relief = "raised", width = 3, height = 2, text = "N", command = nord())
boutonNord.grid(row = 0, column = 0)
fJeu.mainloop() |