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, и вы можете передать ее аргументы из рабочего потока.
Спасибо за быстрый ответ. Я рассмотрю выполнение ввода-вывода в отдельном потоке. – James
Большое спасибо, нет документации, в которой объясняется, как правильно работать с IO в wxpython. Ваш пример объясняет это очень красиво. – Jah