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 :

Problème avec deux wx.App


Sujet :

wxPython

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 36
    Points
    36
    Par défaut Problème avec deux wx.App
    Salut,

    J'ai un gros problème avec mes applications. J'explique :
    J'ai crée deux scripts (ils se trouvent dans deux fichiers différents)
    -> Un script destiné à créer des fichiers (Maker) [Maker.py]
    -> Un script destiné à lire les fichiers crées par le Maker (Reader) [Reader.py]

    Le programme permet d'ordonner des informations contenues dans une liste. Le Maker permet de créer cette liste (à laquelle on peut rajouter autant d'éléments que voulu) que l'on sauve dans un fichier, le Reader récupère ces données et les présente au lecteur. Le Reader se fermer automatiquement lorsque le lecteur a parcouru tous les éléments un par un. Un peu comme un :
    for elements in liste:
    présenter elements a lecteur
    self.frame.Destroy()

    Dans le Maker, je crée un fichier, et je l'enregistre. Quand je l'ouvre avec le Reader, cela marche parfaitement sans aucun problème.

    Maintenant, je voudrais pouvoir faire une preview du fichier tel qu'il serait lu avec le Reader. J'ai crée une wx.Toolbar et j'ai mis un bouton "Test" dessus. Puis, j'importe le Reader et je le lance. Tout fonctionne parfaitement jusqu'à ce que le Reader se ferme(lorsque l'utilisateur a parcouru l'intégralité du fichier)

    Là, aucun message d'erreur ne s'affiche, on dirait que l'application est bloquée. Graphiquement, tout fonctionne puisque je peux appuyer sur les boutons (wx.Button), mais ils ne génèrent pas d'évènements ...
    Par contre, la Toolbar marche très bien puisque elle génère des évènements.
    C'est vraiment bizarre ... J'ai du oublier un truc essentiel ...


    Voici les codes du Maker et du Reader :

    Maker:
    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
     
    import wx
    import Reader
     
    ID_TEST=202
    class MainApp(wx.App):
        def OnInit(self):
            #Variables
            ...
            self.fichier="C:/XXX.xxx"
            self.toolbar=self.frame.CreateToolBar()
            self.toolbar.AddTool(ID_TEST,wx.Bitmap(u"Images/play.png"))
            wx.EVT_MENU(self.frame,ID_TEST,self.OnTest)
            self.bouton1=wx.Button(self.panel,-1,label="OK",pos=(50,50))
            self.Bind(wx.EVT_BUTTON,self.<fonction>,self.bouton1)
            etc ...
            ...
     
        #Fonctions
        ...
        def OnTest(self,evt):
            #On demande à l'utilisateur de sauvegarder son fichier, puis on récupère le chemin du fichier dans self.fichier.
            msg=wx.MessageDialog(self.panel1,message=u"Vous devez sauvegarder avant de pouvoir tester. Appuyez sur \"Oui\" pour sauvegarder.",caption=u"Tester",style=wx.YES_NO|wx.NO_DEFAULT|wx.STAY_ON_TOP|wx.ICON_EXCLAMATION)
            test=msg.ShowModal()
            if test==wx.ID_YES:
                self.OnSave()
                Reader.Reader(self.fichier)
    Reader:
    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
     
    import wx
     
    class Reader(wx.App):
        #J'utilise __init__ pour passer le nom de fichier au Reader afin qu'il puisse l'ouvrir
        def __init__(self,args):
            self.fichier=args
            wx.App.__init__(self)
     
        def OnInit(self):
            if __name__=="__main__":
                dlg=wx.FileDialog( ... ... ...)
                self.fichier=dlg.GetPath()
            #Variables
            #Lecture du fichier et présentation du résultat ...
            #Fermeture automatique via un Destroy() lorsque l'intégralité du fichier a été parcouru
     
    if __name__=='__main__':
        app=Reader("")
        app.MainLoop()
    Toutes les fonctionnalités du Maker sont opérationelles tant que le Reader n'a pas été instancié au moins une fois au sein du Maker ...
    Le Reader fonctionne très bien tout seul.

    Voilà, j'espère avoir été assez clair ...
    Bye et merci de votre aide

    Lotendan

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,

    Tu ne dois instancier qu'un seul wx.App dans un même script!!!
    Sinon chacun des deux créer un thread, reçoit les messages, essaye de les dispacher, un beau foutoir en perspective!

    Je te conseille de faire deriver ton reader de la classe wx.Frame et d'utiliser ton test d'import (if __name__ ...) pour créer ton application.

    @+

    pacificator.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 36
    Points
    36
    Par défaut
    Salut,
    je viens d'essayer, j'ai mis un peu de temps à redériver à partir de la wx.Frame, mais ça marche niquel !!!

    Merci beaucoup Pacificator

    Je passe le post en Résolu, même s'il me reste juste une dernière question :
    A chaque fois que je veux ouvrir une nouvelle fenêtre par-dessus la fenêtre principale, je crée une nouvelle instance d'une wx.Frame, je ne sais pas si c'est le meilleur moyen, j'ai entendu parler d'une top-level, est-ce que quelqu'un saurait m'en dire plus ?

    Bye et merci

    Lotendan

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,
    A chaque fois que je veux ouvrir une nouvelle fenêtre par-dessus la fenêtre principale, je crée une nouvelle instance d'une wx.Frame, je ne sais pas si c'est le meilleur moyen
    Tu peux utiliser les méthodes Show et Hide.
    j'ai entendu parler d'une top-level, est-ce que quelqu'un saurait m'en dire plus ?
    wx.TopLevel est la classe dont héritent les classes wx.Frame et wx.Dialog .

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/05/2007, 17h56
  2. [MySQL] problème avec deux requetes dans un même script
    Par leclone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/02/2007, 10h28
  3. [CSS] Problème avec deux div côte-à-côte
    Par Etanne dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/07/2006, 13h58
  4. Problème avec deux interfaces
    Par ikeaboy dans le forum Langage
    Réponses: 2
    Dernier message: 28/05/2006, 14h56
  5. Réponses: 22
    Dernier message: 29/01/2005, 11h29

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