2012-04-04 5 views
0

Я новичок в Python (и, действительно, новый для ПК) и хотел бы знать, как правильно решить проблему, с которой я использую 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() У меня все еще есть остатки FileDialog, показывающие более нижний из моих объектов wx.TextCtrl (tc2) (tc1 находится в верхней половине разделителя и tc2 в нижней половине).

После того, как файл (ы) полностью загружены и содержимое отображается в tc1, тогда tc2 обновится и отобразится, как я ожидал.

Я попытался вызвать методы обновления на tc1 и tc2 вместо разделителя, но это, похоже, не имеет никакого эффекта.

Любые полезные предложения будут приветствоваться. Благодарю.

ответ

1

Вам не нужно звонить в Refresh(), и они не будут работать. Причина, по которой ваш зависающий графический интерфейс отличается от другого. Функция обратного вызова работает слишком долго и блокирует поток графического интерфейса пользователя.

Ваша задача никогда не должна запускаться с любой задачей, которая может занять не более нескольких миллисекунд в функции обратного вызова без создания нового потока.

Вы должны создать новый поток для своей долговременной задачи. Я рекомендую использовать wx.lib.delayedresult и wx.CallAfter, поскольку они являются наиболее удобными. На эту тему много вопросов/ответов. Например: How to implement a thread in a wxPython GUI application

+0

Большое спасибо за вашу помощь. Я прочитаю рекомендации, которые вы рекомендуете, и реализуйте их в своем приложении. –

 Смежные вопросы

  • Нет связанных вопросов^_^