2010-02-26 2 views
2

Есть ли эквивалент Application.DoEvents() в wxPython?wxPython Application.DoEvents() эквивалентно?

Я создаю форму, а затем выполняю медленное событие ввода-вывода, и форма только частично нарисована до завершения события. Я хочу, чтобы форма была полностью нарисована до начала ввода-вывода.

Я пробовал self.Refresh(), но это не имеет никакого эффекта.

ответ

1

wx.Yield или wx.SafeYield

Хотя вы должны действительно использовать отдельный поток для выполнения ввода/вывода и использовать wx.CallAfter размещать обновления в GUI потоке.

Я обычно использую шаблон, как это:

def start_work(self): 
    thread = threading.Thread(target=self.do_work, args=(args, go, here)) 
    thread.setDaemon(True) 
    thread.start() 
def do_work(self, args, go, here): 
    # do work here 
    # wx.CallAfter will call the specified function on the GUI thread 
    # and it's safe to call from a separate thread 
    wx.CallAfter(self.work_completed, result, args, here) 
def work_completed(self, result, args, here): 
    # use result args to update GUI controls here 
    self.text.SetLabel(result) 

Вы назвали бы start_work из графического интерфейса, например, на EVT_BUTTON событие, чтобы начать работу. do_work запускается в отдельном потоке, но он не может сделать ничего связанного с GUI, потому что это должно быть сделано в потоке графического интерфейса. Поэтому вы используете wx.CallAfter для запуска функции в потоке GUI, и вы можете передать ее аргументы из рабочего потока.

+0

Спасибо за быстрый ответ. Я рассмотрю выполнение ввода-вывода в отдельном потоке. – James

+0

Большое спасибо, нет документации, в которой объясняется, как правильно работать с IO в wxpython. Ваш пример объясняет это очень красиво. – Jah