Найти - Пользователи
Полная версия: tkinter свои events
Начало » GUI » tkinter свои events
1
s_vilgelm
Здравствуйте,
подскажите как правильно создать свой 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 и стал его использовать. Правильно ли я делаю, может есть более верные пути?
Griffon
Вы создали виртуальное событие, в которое включили <событие KeyPress-.> (нажатие на кнопку точка). Затем вы искусственно генерируете это событие. Само по себе событие не предназначено для передачи каких либо параметров. Если же вам надо по событию вызывать функцию с параметром, например при динамической генерации виджетов, то так же динамически создайте функцию, которая будет вызывать целевую функцию с параметром (например lambda event: do(event, 25)), и привязывайте первую к событию.
s_vilgelm
Ясно, а я думал, что можно создавать свои виртуальные события и пользоваться ими. Пришлось применить 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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB