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 :

PIL ImageTK et Thread


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut PIL ImageTK et Thread
    Bonjour à tous,

    je suis nouveau venu et débute avec python
    je souhaite créer un dash-bord qui intègre notamment des captures à partir d'une caméra IP
    je développe sous Windows pour des raisons pratiques, mais le code est destiné à une plateforme ARM sous Débian

    l'extrait du code ci-joint fonctionne très bien sous Windows, mais je rencontre un problème sous Débian (plateforme ARM et Intel, le problème est d'ailleurs le même)

    Quand je quitte mon interface, j'active un événement qui interrompt la temporisation et positionne à True le flag du gestionnaire d’événement du thread.
    En fonction de l’endroit où je me situe dans la boucle While, le programme exécute le code restant avant de quitter la section Run() .
    Le programme bloque sur l’instruction tk_photo = ImageTk.PhotoImage(rdim)

    La seule solution que j’a trouvé, c’est positionner un timeout sur le join() et de tester si le thread est toujours en activité. Si c’est le cas , je force son arrêt. Mais je ne comprends pas pourquoi il bloque sur l’instruction ImageTk.photoImage du module PIL
    J’ai repris ce code sans utiliser de thread , je n’ai pas le problème …

    Quelqu’un a-t-il une idée ?

    PS : dans le code , j'utilise une caméra publique pour le tester par tout le monde ...

    Merci d’avance
    photo2.py

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Sous Python 2 les classes héritent de object et oublie définitivement les global

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Application(object):
        def __init__(self):
            self.rep_images ="./images"
            self.threads = []
            self.root=Tk()
    Tes threads ne devraient pas s'arrêter de cette manière, normalement un thread s'éteint faute de carburant.

    Soit il a achevé sa tâche, soit il n'est plus alimenté, ce qui est ton cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Objetvideo_live(threading.Thread):
        def __init__(self,controle):
            threading.Thread.__init__(self)
            self.controle= controle
            self._fin = False
            ...
     
        def run(self):
            while not self._fin:
            ...
     
        def arretetoi(self):
            self._fin = True

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut Re : PIL ImageTK et Thread => mofications KO
    Bonjour VinsS,
    Merci pour ton aide,

    J'ai corrigé mon pgm en supprimant
    - les variables globlals
    - en ajoutant l'héritage "Object" à ma class Application

    le problème reste le même sous l'environnement Débian : blocage ImageTk.PhotoImage( ...) quand je donne l'info au thread de finir son execution
    (evenement self._fin.set() de mon object self._fin = threading.Event()

    Oui, faute de carburant, je devrais pouvoir mettre fin à l'execution Run() du thread
    mais il bloque tjs sur la même instruction ...
    je contourne en forçant l'arrêt du thread par l'instruction _Thread__stop() , mais ce n'est pas logique ...

    fichier mis à jour : photo2.py

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    J'expliquais dans mon post que threading.Event().set() ne sert aucunement à mettre fin à un thread, utilise la méthode que je t'ai indiquée.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Par défaut Re : PIL ImageTK et Thread => modifications KO
    VinsS


    je pensais que la methode utilisée pour quitter le bloc run() faisait la même chose .
    Elle permetait en plus de ne pas attendre la fin d'une temporisation (quand on utilise un wait exemple "self._fin.wait(2.0)")

    la doc https://docs.python.org/2/library/threading.html fait référence à l'object Event
    Il sert normalement à la communication entre thread mais il peut être détourné ...
    voir explications : http://python.developpez.com/faq/?page=Thread

    j'ai intégré tes modifications => suppression de l'appel au gestionnaire d'évenement et utilisation d'un flag
    le problème est toujours le même .


    Fichier mis à jour

    photo22.py

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par frlep501 Voir le message
    VinsS


    je pensais que la methode utilisée pour quitter le bloc run() faisait la même chose .
    Elle permetait en plus de ne pas attendre la fin d'une temporisation (quand on utilise un wait exemple "self._fin.wait(2.0)")

    la doc https://docs.python.org/2/library/threading.html fait référence à l'object Event
    Il sert normalement à la communication entre thread mais il peut être détourné ...
    voir explications : http://python.developpez.com/faq/?page=Thread

    j'ai intégré tes modifications => suppression de l'appel au gestionnaire d'évenement et utilisation d'un flag
    le problème est toujours le même .


    Fichier mis à jour

    photo22.py
    Bonjour,

    Une idée en passant : si cela fonctionne OK sous Windows mais pas sous Debian ARM/Intel => peut-être que cela vient tout simplement des options de compilation de Tcl/Tk / Tkinter sous Debian ARM/Intel ?

    Une option du style --threading=no-threads (je dis ce nom d'option au pif, là).

    Peut-être faudrait-il regarder de ce côté-là ?

    @+.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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