Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2012 00:11:03

s_vilgelm
От:
Зарегистрирован: 2010-10-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter свои events

Здравствуйте,
подскажите как правильно создать свой 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)

В принципе, всё работает, но не понятно как. Например в функцию event_add вторым параметром передаю “.”, это какой-то не понятный мне sequence. Я так и не понял, зачем он нужен. Далее в генерации, методом проб и дебага обнаружил, что state в моем event всегда 0 и стал его использовать. Правильно ли я делаю, может есть более верные пути?



Офлайн

#2 Сен. 16, 2012 08:17:56

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

tkinter свои events

Вы создали виртуальное событие, в которое включили <событие KeyPress-.> (нажатие на кнопку точка). Затем вы искусственно генерируете это событие. Само по себе событие не предназначено для передачи каких либо параметров. Если же вам надо по событию вызывать функцию с параметром, например при динамической генерации виджетов, то так же динамически создайте функцию, которая будет вызывать целевую функцию с параметром (например lambda event: do(event, 25)), и привязывайте первую к событию.



Офлайн

#3 Сен. 16, 2012 11:23:44

s_vilgelm
От:
Зарегистрирован: 2010-10-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter свои events

Ясно, а я думал, что можно создавать свои виртуальные события и пользоваться ими. Пришлось применить 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)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version