Форум сайта python.su
Здравствуйте,
подскажите как правильно создать свой event, с генерировать его, и в нем передать какой-нибудь параметр.
сейчас делаю так:
# Создание self.master.event_add("<<MyVirtualEvent>>", ".") #Отправка self.master.event_generate('<<MyVirtualEvent>>', state=id) #Привязка self.bind("<<MyVirtualEvent>>", self.do) #Обработка def do(self, event=None): id = int(event.state)
Офлайн
Вы создали виртуальное событие, в которое включили <событие KeyPress-.> (нажатие на кнопку точка). Затем вы искусственно генерируете это событие. Само по себе событие не предназначено для передачи каких либо параметров. Если же вам надо по событию вызывать функцию с параметром, например при динамической генерации виджетов, то так же динамически создайте функцию, которая будет вызывать целевую функцию с параметром (например lambda event: do(event, 25)), и привязывайте первую к событию.
Офлайн
Ясно, а я думал, что можно создавать свои виртуальные события и пользоваться ими. Пришлось применить event patter, в общем пока остановился на таком решении:
#модуль core class EventHook(object): """Event pattern""" def __init__(self): self._handlers = [] def __iadd__(self, handler): self._handlers.append(handler) return self def __isub__(self, handler): self._handlers.remove(handler) return self def __call__(self, *args, **keywargs): for handler in self._handlers: handler(*args, **keywargs) # Тестирование class TestCore(unittest.TestCase): def test_event_hook(self): class A(object): def __init__(self): self.on_change = core.EventHook() class B(object): def __init__(self): self.value = None def set_value(self, value): self.value = value a = A() b = B() c = B() a.on_change += b.set_value a.on_change += c.set_value a.on_change(True) self.assertTrue(b.value) self.assertTrue(c.value) a.on_change(False) self.assertFalse(b.value) self.assertFalse(c.value) a.on_change -= b.set_value a.on_change -= c.set_value a.on_change(True) self.assertFalse(b.value) self.assertFalse(c.value)
Офлайн