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

Tkinter Python Discussion :

Binder un événement socket dans Tkiner


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2020
    Messages : 7
    Points : 5
    Points
    5
    Par défaut 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 : 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
     
    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()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Salut,

    Pour que çà réagisse à l'arrivée d'un message côté socket, il faudrait pouvoir dire à tkinter: "tiens lorsqu'un message arrive déclenche ce callback (ou appelle cette fonction)".
    C'est possible via createfilehandler mais çà ne fonctionne que sur Linux/OSX (et avec des restrictions les échanges réseaux ne se ramènent pas toujours à des échanges avec un fichier).

    Dans le cas Windows (et dans le cas général), il faut écrire plus de code: pousser le dialogue réseau dans un thread, tester périodiquement l'arrivée de messages via .after,...

    Rien de bien compliqué mais beaucoup de choses à apprendre avant d'être à l'aise.

    - W

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2020
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse.

    Après avoir posté, j'ai continué mes recherche, et j'en étais arrivé à la même conclusion : utiliser les threads.
    Par contre, pour le after, j'avais pas vu ;-). Tant mieux, ça m'apprendra un truc de plus.

    Donc, j'ai du boulot (et j'aime ça)

Discussions similaires

  1. pb de socket dans une appli MFC
    Par Nelmo dans le forum MFC
    Réponses: 1
    Dernier message: 04/06/2006, 19h02
  2. l'évènement "keypress" dans une textbox
    Par dams580 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 15/05/2006, 14h02
  3. IOException sur socket dans un package
    Par gint dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/03/2006, 19h45
  4. [zone de liste] événement absence dans liste
    Par platon dans le forum Access
    Réponses: 1
    Dernier message: 07/11/2005, 09h57

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