wxPython: использование EVT_IDLE - PullRequest
3 голосов
/ 23 апреля 2009

Я определил обработчик для EVT_IDLE, который выполняет определенную фоновую задачу для меня. (Эта задача состоит в том, чтобы взять законченную работу из нескольких процессов и интегрировать ее в некоторый объект, внося видимые изменения в графический интерфейс.)

Проблема в том, что когда пользователь не двигает мышь или ничего не делает, EVT_IDLE не вызывается более одного раза. Я хотел бы, чтобы этот обработчик работал все время. Поэтому я попытался вызвать event.RequestMore() в конце обработчика. Работает, но теперь требует много ресурсов процессора. (Я предполагаю, что это просто чрезмерно зацикливается на этой задаче.)

Я готов ограничить количество раз, когда задание будет выполняться в секунду; Как мне это сделать?

Или у вас есть другое решение?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2009

Примерно так (выполняется максимум каждую секунду):

...

def On_Idle(self, event):
    if not self.queued_batch:
        wx.CallLater(1000, self.Do_Batch)
        self.queued_batch = True

def Do_Batch(self):
    # <- insert your stuff here
    self.queued_batch = False

...

О, и не забудьте установить для self.queued_batch значение False в конструкторе и, возможно, вызвать event.RequestMore () каким-либо образом в On_Idle.

0 голосов
/ 24 апреля 2009

Это похоже на вариант использования для wxTimerEvent вместо wxIdleEvent. Когда есть обработка, вызовите wxTimerEvent.Start (). Когда делать нечего, вызовите wxTimerEvent.Stop () и вызовите ваши методы для обработки из EVT_TIMER.

(примечание: я использую от wxWidghets для C ++ и не знаком с wxPython, но я предполагаю, что у них похожий API)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...