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 :

Tkinter & threads


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut Tkinter & threads
    Bonjour,

    En TP nous a été demandé de programmer un Pong.

    J'ai fait une première version basique qui marche (presque) bien, il faut juste que je mette le changement d'angle en fonction de la zone où la balle touche la palette. Ca doit pas être difficile (modulo, angle...), je préfère me consacrer à quelque chose qui me semble plus intéressant : la gestion des threads.

    En effet, dans cette première version (pong.py), il est impossible aux joueurs de descendre en même temps.

    J'ai donc cherché comment effectuer la gestion des threads (sachant qu'on n'a pas encore abordé la poo avec python). J'ai trouvé pas mal de sites intéressants.


    Dans la deuxième version (pongtest.py), j'ai ajouté le module thread, j'ai créé les 4 threads, j'ai modifié le binding des touches A, Q, <Up> et <Down> quand on appuie/relache.

    Quand on appuie sur Q, on appelle la fonction Descend2 avec comme argument l'évènement ("appui sur la touche Q") qui lance le thread correspondant. Si la touche est relachée ("<Releasekey-Q>"), on appelle une fonction similaire qui est censée stopper le thread : nomduthread._Thread__stop()

    Le problème, c'est que j'ai l'impression que les threads ne sont pas du tout du tout stoppé, je me chope une erreur : "RuntimeError: threads can only be started once"

    J'ai pensé à, au lieu de stopper un thread quand on relache une touche, mettre en pause son exécution jusqu'à l'appui de la même. Mais puisque je ne comprends rien aux certains definitions des threads (avec des __init__ je-sais-plus-trop-quoi) je n'ai pas pu trouver quelque chose permettant de mettre la pause.

    Vous trouverez mes codes ci-joints.


    J'aurai donc deux questions :
    ___Existe-t-il un moyen de gérer plusieurs évènements "en même temps" avec tkinter ? J'ai sûrement zappé quelque chose avant d'aller me lancer dans les threads...
    ___Sinon, comment stopper un thread FACILEMENT ? :o

    Merci !

    Bonne journée

    PS : J'ai aussi un petit problème, j'ai essayé de faire une pop-up d'info avec tkMessageBox.showinfo("You lost", "You lost"), j'ai "NameError: global name 'tkMessageBox' is not defined"....
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Lisez la documentation du module threading . Cherchez des exemples via Google.
    Leur intérêt est de répartir le CPU entre des activités indépendantes.
    Les threads étant réalisée par l'OS, çà fonctionne par préemption.

    Aujourd'hui vous utiliser Tk, c'est un GUI graphique. Vous avez utilisé .after pour ordonnancer déplacement de la balle. Vous avez utilisé .bind pour déclencher le déplacement des pions en fonction de l'appui sur certaines touches. Ces activités sont déclenchées de façon asynchrone et leur durée est suffisamment brève: pas la peine d'utiliser une mécanique de préemption pour que çà fonctionne. Charger un fichier de plusieurs Meg sur internet, ou faire de gros calculs sont des activités qui prendront du temps, si on veut que l'application puisse faire autre chose il faudra "pré-empter".

    Dans la discussion, vous trouverez un exemple de communication entre un widget Text et un interpréteur Python qui affiche ses entrées sorties dedans.
    Cela vous donnera une idée des difficultés à résoudre pour essayer de traiter la chose proprement.


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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Lisez la documentation du module threading
    Fait
    Citation Envoyé par wiztricks
    Cherchez des exemples via Google.
    Fait

    Citation Envoyé par wiztricks
    Ces activités sont déclenchées de façon asynchrone et leur durée est suffisamment brève: pas la peine d'utiliser une mécanique de préemption pour que çà fonctionne.
    Si tel est le cas (je n'en doute pas), comment faire pour que les deux objets se déplacent en même temps ? Tkinter ne semble pas gérer l'appui de deux touches en simultané...

    Citation Envoyé par wiztricks
    Dans la discussion, vous trouverez un exemple de communication entre un widget Text et un interpréteur Python qui affiche ses entrées sorties dedans.
    Cela vous donnera une idée des difficultés à résoudre pour essayer de traiter la chose proprement.
    Merci bien, je vais m'y consacrer. (C'est pas gagné, je bloque à la ligne 11...).


    Merci pour votre réponse.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par kajaeshi Voir le message
    Si tel est le cas (je n'en doute pas), comment faire pour que les deux objets se déplacent en même temps ? Tkinter ne semble pas gérer l'appui de deux touches en simultané...
    Avec un ordinateur la simultanéïté est une vue de l'esprit: l'UC traitera, la plupart du temps, les événements reçus de l'extérieur de façon séquentielle.
    Ce séquencement est à l'interface entre l'OS et le pilote du matériel.

    Les dépendances entre matériel/pilote/OS avec ce séquencement sont fortes.
    Ajouter des threads n'y changera pas grand chose: ajouter un clavier USB le pourra peut être.

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

Discussions similaires

  1. Thread et rafraichissement Tkinter
    Par panda31 dans le forum Tkinter
    Réponses: 8
    Dernier message: 25/05/2009, 08h48
  2. Gestion d'une IHM Tkinter par un thread
    Par Julien38 dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/05/2009, 22h44
  3. thread et tkinter
    Par Dbutant dans le forum Tkinter
    Réponses: 1
    Dernier message: 11/04/2009, 15h38
  4. python, tkinter et les sockets (et les threads)
    Par bomberwaterman dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 02/01/2009, 19h53
  5. [Tkinter] Thread pas logique!
    Par airod dans le forum Tkinter
    Réponses: 4
    Dernier message: 26/11/2006, 22h36

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