2012-04-04 8 views
0

私はPythonを初めて使っています(実際には、PC開発の初心者です)、FileDialogを使用している問題を正しく解決する方法を知りたい私が書いているWindowsアプリケーションで...ここPython(Windows XP) - wx.FileDialogはDestroy()の後に部分的に残っています

は私のコードの関連部分で、これまでに...

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

私の問題は、私はopen_dlg.Destroy()と自己を呼び出すにもかかわらず、ということです。 splitter.Refresh()私はwx.TextCtrl(tc2)オブジェクト(tc1はスプリッタの上半分にあり、tc2は下半分にあります)の下の方にFileDialogの残りを表示しています。

ファイルが完全にロードされ、内容がtc1に表示されると、tc2はリフレッシュして表示されます。

スプリッターではなくtc1とtc2でリフレッシュメソッドを呼び出そうとしましたが、これは効果がないようです。

有用な提案があれば歓迎します。ありがとう。

答えて

1

Refresh()へのコールは必要ありません。これらのコールは機能しません。 GUIがフリーズする理由は異なります。コールバック関数が長時間実行され、GUIスレッドがブロックされます。

新しいスレッドを作成せずにコールバック関数で数ミリ秒以上かかるタスクは決して実行しないでください。

長時間実行するタスク用に新しいスレッドを作成する必要があります。最も便利なのはwx.lib.delayedresultwx.CallAfterです。 SOに関するこのトピックに関する多くの質問/回答があります。例:How to implement a thread in a wxPython GUI application

+0

ご協力いただきありがとうございます。私が推奨するソリューションをお読みいただき、アプリケーションに実装します。 –

関連する問題