2012-04-04 1 views
0

Je suis nouveau sur Python (et, en effet, nouveau pour le développement de PC) et je voudrais savoir comment je devrais résoudre correctement un problème que j'ai utilisé FileDialog dans une application Windows Je vous écris ...Python (Windows XP) - wx.FileDialog reste partiellement après Destroy()

Voici la partie pertinente de mon code jusqu'à présent ...

def SelectLogs(self, event): 

    dir = os.getcwd() 
    paths = [] 

    open_dlg = wx.FileDialog(self, message='Select log file', 
     defaultDir=dir, style=wx.OPEN | wx.CHANGE_DIR | wx.MULTIPLE) 

    self.splitter.Refresh(True) 

    if open_dlg.ShowModal() == wx.ID_OK: 
     paths = open_dlg.GetPaths() 
     open_dlg.Destroy() 

     self.splitter.Refresh() 

     self.RetrieveLogData(paths) 

    def RetrieveLogData(self, paths): 

     count = 0 
     loglines = [] 

     self.tc2.WriteText('Loading selected logs...') 

     paths.sort() 

     for log in paths: 
      read_data = [] 
      f = open(log, 'r') 

      self.tc2.WriteText('\r\n ' + log) 

      read_data = f.readlines() 
      f.close() 

      count = count + 1 

      for line in read_data: 
       loglines.append(line) 
       self.tc1.WriteText(line) 

     self.tc2.WriteText('\r\nCompleted loading ' + str(count) + ' log(s)') 

mon problème est que même si j'appelle open_dlg.Destroy() et moi. splitter.Refresh() J'ai encore des restes de l'affichage FileDialog sur l'objet inférieur de mes objets wx.TextCtrl (tc2) (tc1 est dans la moitié supérieure du séparateur et tc2 dans la moitié inférieure).

Une fois que le (s) fichier (s) est (sont) entièrement chargé (s) et que le contenu est affiché dans tc1, puis tc2 se rafraîchit et affiche comme je l'attendais.

J'ai essayé d'appeler les méthodes d'actualisation sur tc1 et tc2 plutôt que sur le séparateur, mais cela ne semble pas avoir d'effet.

Toutes les suggestions utiles seront les bienvenues. Merci.

Répondre

1

Vous n'avez besoin d'aucun appel à Refresh() et ceux-ci ne fonctionneront pas. La raison pour laquelle votre interface graphique se fige est différente. Votre fonction de rappel fonctionne trop longtemps et bloque votre thread graphique.

Votre tâche ne devrait jamais exécuter plus de quelques millisecondes dans une fonction de rappel sans créer de nouveau thread.

Vous devez créer un nouveau thread pour votre tâche de longue durée. Je recommande d'utiliser wx.lib.delayedresult et wx.CallAfter car ce sont les plus pratiques. Il y a beaucoup de questions/réponses sur ce sujet sur SO. Par exemple: How to implement a thread in a wxPython GUI application

+0

Merci beaucoup pour votre aide - je vais lire les solutions que vous recommandez et les implémenter dans mon application. –