wxWidgets/wxPython: Два одинаковых события вызывают две обработки?

Когда в цикле событий есть два идентичных события, будет ли wxPython обрабатывать их оба или он будет вызывать обработчик только один раз для них обоих?

Я имею в виду, что в моем виджете я хочу иметь событие типа EVT_NEED_TO_RECALCULATE_X. Я хочу, чтобы это событие было опубликовано во всех видах различных обстоятельств, которые требуют пересчета x. Однако, даже если есть две разные причины для пересчета x, необходимо выполнить только один пересчет.

Как мне это сделать?

ИЗМЕНИТЬ:

Я пробовал этот код:

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None):
        wx.Frame.__init__(self, parent)

        self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event)

        self.Centre()
        self.Show(True)

        self.i = 0

        self.event_all()

    def on_event(self, event):
        print self.i
        self.i += 1

    def event_all(self):
        for j in range(1000):
            event = wx.PyEvent()
            event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0])
            wx.PostEvent(self, event)


app = wx.App()
Frame(None)
app.MainLoop()

Если события делают сгруппированы вместе, я ожидаю, что они не будут считаться до 1000. Но это так. Они группируются или нет?


person Ram Rachum    schedule 04.04.2010    source источник


Ответы (2)


ты говоришь о трех вещах

  • событие
  • источник события
  • обработка событий

Событие единичное (X нужно пересчитать). Он имеет несколько источников. Но у него есть только один обработчик.

Так что это должно просто работать. Вы делаете это отдельным событием, добавляете к нему один обработчик, но сигнализируете/вызываете событие всякий раз, когда хотите — каждый раз, когда вы поднимаете флаг need X recalculated, обработчик должен запускаться один раз.


ИЗМЕНИТЬ:

Эта линия...

event = wx.PyEvent()

...создает новое событие. Это означает, что что-то произошло, и на это нужно отреагировать. Если вы создадите 1000 событий, то обязательно обработчик событий будет вызван 1000 раз.

Обработчик будет вызываться один раз при каждом возникновении события, то есть один раз для каждого экземпляра PyEvent, который отправляется в очередь событий.

Если вы хотите сгруппировать их, один из способов — не создавать новый экземпляр PyEvent, если он находится в ожидании:

class Frame(wx.Frame):
    def __init__(self, parent=None):
        wx.Frame.__init__(self, parent)
        self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event)
        self.Centre()
        self.Show(True)
        self.i = 0
        self.recalculating = False
        self.event_all()

    def on_event(self, event):
        self.recalculating = False
        print self.i
        self.i += 1

    def event_all(self):
        for j in range(1000):
            if not self.recalculating:
                event = wx.PyEvent()
                event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0])
                wx.PostEvent(self, event)
                self.recalculating = True
person nosklo    schedule 04.04.2010
comment
Подождите, мне действительно нужно создать этот флаг требуется пересчет X или он создан для меня? - person Ram Rachum; 04.04.2010

Если вы опубликуете событие 1000 раз, вы получите его 1000 раз, зачем какой-либо системе событий группировать их, это было бы ошибкой.

Если вы не хотите иметь дело со всеми 1000 из них, игнорируйте их, также только вы можете решить, как они должны быть сгруппированы, если пользователь что-то быстро меняет, хотите ли вы сгруппировать эти изменения или реагировать на все события и иметь лучший отзывчивый пользовательский интерфейс?

В вашем случае может быть, вы должны либо

  1. сгруппируйте их по времени, например. обрабатывать события, которые происходят с разницей в N мс
  2. Сгруппируйте со значением, например. если последнее значение совпадает с текущим значением, ничего не делать
  3. Установите флаг, если объект был изменен, вы получаете событие, вы что-то делаете и сбрасываете флаг, поэтому в следующий раз при проверке события флаг действительно что-то изменилось или нет.

Но суть в том, что вы должны решить, как реагировать на события.

person Anurag Uniyal    schedule 05.04.2010