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 :

affichage interface et thread


Sujet :

wxPython

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut affichage interface et thread
    salut à tous

    je suis en train d'essayer de programmer un petit aspirateur de site qui a surtout pour fonction de récupérer tous les PDF d'un site de doc.
    l'aspirateur marche très bien.
    Et puis j'ai voulu lui mettre une interface autre que la console et j'en ai profité pour me mettre à wxPython.
    Mon problème, c'est que la fenêtre ne s'affichait qu'une fois l'aspiration terminée.
    Je me suis donc dit qu'en mettant l'aspirateur en Thread, ça devrait marcher. Voilà les parties de mon code concernées :

    Interface :
    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
    class Interface(wx.Frame) :
     
            def __init__(self, parent, id, title) :
     
                    wx.Frame.__init__(self, parent, id, title, style = wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX, size = (406, 500))
     
                    panel = wx.Panel(self, -1)
     
                    font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
                    self.titre = wx.StaticText(panel, -1, u'Aspirateur', (125, 15))
                    self.titre.SetFont(font)
     
     
                    wx.StaticLine(panel, -1, pos = (10, 40), size = (380, 1))
     
                    message = 'Récupération des PDF\n\n'
     
                    wx.StaticText(panel, -1, message, pos = (10, 55))
     
                    wx.StaticLine(panel, -1, pos = (10, 110), size = (380, 1))
     
                    self.affichage = wx.TextCtrl(panel, -1, pos = (0, 120), size = (400, 250), style=wx.TE_MULTILINE)
     
                    self.barreProgression = wx.Gauge(panel, -1, 100, pos = (10, 380), size = (380, 20))
     
                    self.boutonQuitter = wx.Button(panel, wx.ID_EXIT, 'OK', pos = (165, 410), size = (70, 30))
                    self.barreStatut = self.CreateStatusBar()
     
                    self.Bind(wx.EVT_BUTTON, self.OnQuit, id = wx.ID_EXIT)
     
                    self.Centre() # centrage dans l'écran
                    self.Show() # affichage de la fenêtre
     
                    self.aspi = Aspirateur(self.barreProgression, self.affichage)
                    self.aspi.start()
    et le début de l'aspirateur :

    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
    class Aspirateur(Thread) :
     
     
            def __init__(self, progressBar, zoneTexte) :
     
                    Thread.__init__(self)
     
                    self.progressBar = progressBar
                    self.zoneTexte = zoneTexte
     
                    parametres = initialiseParam()
                    self.indexMemorial = parametres[0]
                    self.dossierTelechargement = parametres[1]
                    self.motifLien = parametres[2]
                    self.motifRepNom = parametres[3]
                    self.motifLienAnnee = parametres[4]
     
                    self.motifLienCompile = re.compile(self.motifLien)
                    self.motifRepNomCompile = re.compile(self.motifRepNom)
                    self.motifLienAnneeCompile = re.compile(self.motifLienAnnee)
     
                    self.zoneTexte.SetValue(u'Début du traitement\n\n')
                    self.lancement()
    Or malgrès cela, ma fenêtre ne s'affiche correctement qu'à la fin de l'exécution de l'aspirateur. Pendant l'exécution, je n'ai que la progress bar et le TextCtrl.

    De plus, dans l'aspirateur, une fois le fichier PDF téléchargé, je souhaite le convertir en texte. J'ai un petit logiciel qui me fait ça bien (pdf2txt) mais je ne sais pas le lancer autrement qu'avec un os.system. Or, dés que je le lance, mon affichage freeze totalement. Il s'agit pourtant d'une partie du code dans mon thread d'aspirateur, pas dans la fenêtre wx.

    Ne connaissant ni wx, ni les threads avant de m'attaquer à ce programme, je ne sais pas du tout ce qui se passe. Est-ce que quelqu'un a déjà eu ce problème ou simplement sait d'où cela vient ?

    Merci de votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    Bonjour,

    Tu mets quoi comme infos à jours à part ta barre de prog. Un statictext ?
    Il te faut mettre des self.Update() pour que l'affichage soit actualiser, je suis étonné d'ailleurs que ta barre de progression fonctionne sans. Moi j'avais tout le reste sauf elle qui s'affichait à la fin. Chaque fois que tu modifies quelques chose dans ton panel d'origine, pense à mettre derrière une actualisation je pense que tu devrais avoir de meilleur résultat

    EDIT: Pour ton deuxième problème, utilise plutôt ceci
    http://docs.python.org/library/subprocess.html
    Il te permet de lancer une appli externe et d'en vérifié l'exécution, pratique.
    Sinon y a encore pywin32.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    merci de ta réponse, avec le Popen et les Update, tout marche bien.

    Quelques petites précisions tout de même :

    je fais un Update sur chaque objet de l'interface avant le lancement de mon thread aspirateur. Du coup, tout s'affiche correctement au départ.

    je ne fais pas d'Update, ni sur le TextCtrl, ni sur la Gauge (progressBar) pendant l'exécution, il se font tout seul.

    par ailleurs, j'utilisais os.system dans plein de petites application et je sens que je vais tout passer en Popen, c'est super. Plus de fenêtre shell !

    merci beaucoup

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    De rien, si tu veux un exemple, j'ai laissé en "plan" car encore bugué, mes sources de mon log winpsexec, ca pourra t'aider peut être, je n'utilise pas de thread par contre, un tort peu être.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Par défaut
    salut

    oui, je suis intéressé par ton code. Dis moi comment tu veux faire pour me le faire parvenir.

    Et merci encore pour ton aide.

    Cordialement

    cyrull

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    C'est pas de grand art mais ca pourra peut etre t'aider

    http://www.developpez.net/forums/d66...ce-via-psexec/

Discussions similaires

  1. [Thread] Interface et thread
    Par airod dans le forum Général Python
    Réponses: 16
    Dernier message: 03/01/2007, 12h38
  2. problème d'affichage dans un thread
    Par innosang dans le forum POSIX
    Réponses: 8
    Dernier message: 20/12/2006, 20h40
  3. Affichage dans un thread // gestion du clavier!
    Par phraides dans le forum SDL
    Réponses: 5
    Dernier message: 08/07/2006, 12h14
  4. [VISUAL EDUTOR] Problème Affichage Interface
    Par mathieu77186 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/03/2006, 17h08
  5. [Threads et interface] le thread bloque tout
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 28/10/2004, 16h52

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