2012-04-04 9 views
0

Ich bin neu in Python (und in der Tat neu in der PC-Entwicklung) und würde gerne wissen, wie ich ein Problem mit FileDialog richtig lösen soll in einer Windows-Anwendung ich schreibe ...Python (Windows XP) - Wx.FileDialog bleibt teilweise nach Destroy()

Hier ist der relevante Teil meiner Code ist so weit ...

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)') 

Mein Problem ist, dass, obwohl ich nenne open_dlg.Destroy() und selbst. splitter.Refresh() Ich habe immer noch Reste des FileDialogs, die über dem unteren meiner wx.TextCtrl (tc2) Objekte angezeigt werden (tc1 ist in der oberen Hälfte des Splitters und tc2 in der unteren Hälfte).

Sobald die Datei (en) vollständig geladen sind und der Inhalt in tc1 angezeigt wird, wird tc2 aktualisiert und wie erwartet angezeigt.

Ich habe versucht, die Refresh-Methoden auf tc1 und tc2 statt auf dem Splitter aufzurufen, aber das scheint keine Wirkung zu haben.

Alle nützlichen Vorschläge sind willkommen. Vielen Dank.

Antwort

1

Sie brauchen keine Anrufe an Refresh() und diese werden nicht funktionieren. Der Grund, warum Ihre GUI friert, ist anders. Ihre Callback-Funktion läuft zu lange und blockiert Ihren GUI-Thread.

Sie sollten niemals eine Aufgabe ausführen, die in einer Callback-Funktion mehr als nur einige Millisekunden dauern kann, ohne einen neuen Thread zu erstellen.

Sie sollten einen neuen Thread für Ihre lang laufende Aufgabe erstellen. Ich empfehle die Verwendung wx.lib.delayedresult und wx.CallAfter, da dies die bequemste sind. Es gibt viele Fragen/Antworten zu diesem Thema auf SO. Zum Beispiel: How to implement a thread in a wxPython GUI application

+0

Vielen Dank für Ihre Hilfe - ich werde die von Ihnen empfohlenen Lösungen lesen und sie in meiner Anwendung implementieren. –