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

wxPython Discussion :

Ouverture d'un dialog modal dans un thread


Sujet :

wxPython

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 26
    Points
    26
    Par défaut Ouverture d'un dialog modal dans un thread
    Bonjour à tous.

    Mon problème est le suivant : J'ai une interface graphique qui marche, et dans l'application je crée un thread qui tourne pendant un petit moment.

    Dans ce thread, j'appelais deux MessageDialog successivement, et cela marchait, le thread se mettait tout seul en pause le temps que le ShowModal() se termine.

    J'ai voulu passer de ces deux MessageDialog à un seul Dialog, que j'ai codé en héritant de la classe wx.Dialog.

    mon affichage en modal marche sans problème quand j'appelle uniquement cette fenêtre modale, mais lorsque je l'appelle dans mon programme depuis le thread, j'ai ce problème là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    " File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 711, in ShowModal
        return _windows_.Dialog_ShowModal(*args, **kwargs)
    PyAssertionError: C++ assertion "IsRunning()" failed at ..\..\src\msw\evtloop.cpp(222) in wxEventLoop::Dispatch(): can't call Dispatch() if not running"
    Ce que je ne comprend pas, c'est pourquoi ça marche avec des MessageDialog, qui descend de wx.Dialog, mais pas avec une fenêtre dérivant de wx.Dialog que j'ai coder moi même.

    Dans les deux cas, j'appelle la fonction ShowModal(), les créations des dialog se font au même endroit, et leur appel en modal idem.

    Je suis à court d'idée, please, help!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    Personne n'a une idée ou n'aurait déjà eu ce problème auparavant svp? ^^

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Il me semble bien avoir eu le même message dans le passé. Il s'agit d'un problème entre le Mainloop de wxpython et le thread. Il faut regarder du coté de wx.CallAfter, ou créer un évènement personnalisé à utiliser avec wx.PostEvent.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut
    Ca tombe bien. J'allais justement poser une question identique sauf que dans ma situation, je cherche à lancer une frame à partir d'un thread.

    J'ai déjà essayé avec wx.CallAfter, mais sans succès...

    Nyko77, pourrais-tu nous indiquer comment utiliser wx.PostEvent ? parce que là je coince...

    Merci !

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Serait-il possible de poster ton code, même si ça fonctionne pas.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    Bon, j'ai du nouveau, en fait, ça marche donc bien avec MessageDialog, mais avec aucune autre fenetre modale, comme par exemple SingleChoiceDialog.

    Je ne comprend plus rien là... Si vous avez une idée, n'hésitez pas! ^^

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

    Regardez la discussion http://www.developpez.net/forums/d86...eading-python/

    Essayez d'utiliser l'exemple d'active state

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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 28
    Points : 26
    Points
    26
    Par défaut
    Bon bah pour ma part, j'ai résolu le problème en le contournant. Comme ma fenêtre n'est pas nécessairement active pendant l'exécution de mon thread(qui lui tourne en permanence), elle attend des évènements utilisateurs uniquement.

    Donc, j'ai fait que mon thread envoyait des évènements vers ma fenêtre principale, et se verrouille sur un loquet (une boucle while sur une variable de mon programme, avec un stime.sleep(0.1) entre chaque test). L'évènement lui est traité dans ma fenêtre (qui gère l'application) et c'est elle qui fait poper la fenêtre modale, puis qui modifie la variable loquet quand le résultat est bon.

    Je ne suis pas vraiment sur que cela donne une application très MVC, mais bon, ça à l'avantage de laisser tout l'affichage à la fenêtre principale, même si du coup le thread n'est plus indépendant (il doit attendre le déverrouillage du loquet dans le programme).

    Voilà, donc selon l'expérience menée ici, les thread ne peuvent normalement pas afficher de fenêtre, quelles qu'elles soit, mais il semblerait que wx.MessageDialog soit l'exception qui confirme la règle... Ah c'est pas pratique! M'enfin en tout cas, problème résolu (ou plutôt contourné)

    Merci à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C# affichage DIALOG BOX dans un Thread
    Par juniorAl dans le forum C#
    Réponses: 0
    Dernier message: 10/11/2010, 16h12
  2. Probleme de dessin dans un dialog modal
    Par Charlock dans le forum MFC
    Réponses: 1
    Dernier message: 07/05/2008, 11h58
  3. Ouverture d'une fenêtre non modale dans un Thread
    Par Cyrill26 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/02/2008, 17h30
  4. [C#] Comment appeler une fenêtre modale dans un autre thread ?
    Par Pilloutou dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/10/2006, 11h19
  5. [MFC] Créer une CDialog non modale dans un thread
    Par fleur_de_rose dans le forum MFC
    Réponses: 3
    Dernier message: 29/09/2006, 11h43

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