Эквивалент wxPython Application.DoEvents()?

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

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

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


person James    schedule 26.02.2010    source источник


Ответы (1)


wx.Yield или wx.SafeYield

Хотя на самом деле вам следует использовать отдельный поток для ввода-вывода и использовать wx.CallAfter для отправки обновлений в Графический поток.

Обычно я использую такой шаблон:

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 запускается в отдельном потоке, но он не может делать ничего, связанного с графическим интерфейсом, потому что это нужно делать в потоке графического интерфейса. Таким образом, вы используете wx.CallAfter для запуска функции в потоке графического интерфейса и можете передавать ей аргументы из рабочего потока.

person FogleBird    schedule 26.02.2010
comment
Спасибо за быстрый ответ. Я рассмотрю возможность ввода-вывода в отдельном потоке. - person James; 26.02.2010
comment
Большое спасибо, сэр, нет документации, объясняющей, как правильно работать с вводом-выводом в wxpython. Ваш пример очень хорошо объясняет это. - person Jah; 12.10.2012