Обертка вокруг с Python API для создания пользовательских интерфейсов


Я пишу обертку вокруг GeUserArea класс Кино 4Dс помощью Python API для создания пользовательских интерфейсов с использованием объектно-ориентированный интерфейс.

Я уже написал 2 прототипы, но меня не устраивает мой класс-Дизайн. Они делают работу очень хорошо, но я решил начать все сначала, чтобы сделать его еще более эффективным, более чистым и лучше комментирует и т. д.

В GeUserArea класс обеспечивает нанесение на его поле пикселей, так что это очень динамичный класс, чтобы позволить почти любой тип интерфейса, который вы хотите, когда у вас есть навыки.

Класс для всех объектов рендерится является визуализируемойкласс. Два подклассы вид и этикетки. Разница между ними является то, что вид занимает кадра атрибута, который определяет прямоугольную область, а ярлык не только удерживать позиции атрибута, который определяет положение воспроизводимого текста.

В визуализируемой класс реализует древовидную конструкцию, поэтому вы можете добавить передать экземпляр ниже другой и т. д. Когда событие ввода (мышь/клавиатура) появляется цепочка начинается, что говорит полное дерево, что это событие произошло. Любой визуализируемой экземпляр должен быть в состоянии реагировать на события ввода. Но вид-подкласс должен также вызвать метод, когда мышь нажата в это области.

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

Само событие происходит от GeUserArea.InputEvent(самовыдвижение, МСГ). От МСГ параметр, я могу зачитать, если и где мыши событие произошло. После этого цепочка событий начинается.

class Renderable:
    def InputEvent(self, msg):
        pass

class View(Renderable):
    def MouseEvent(self, msg, mouse):
        pass

Используя приведенный выше макет, мне нужно реализовать метод, который управляет вызова этих методов, как это:

class Renderable:
    # ..
    def _private_ManageInput(self, msg):
        self.InputEvent(msg)
        for sub in self.subs:
            sub._private_ManageInput(msg)

class View(Renderable):
    # ..
    def _private_ManageInput(self, msg):
        if IsMouseEvent(msg):
            mouse = GetMouse(msg)
            if mouse in self.frame:
                self.MouseEvent(self, msg, mouse)
        Renderable._private_ManageInput(self, msg)

Это уже кажется немного грязным.

Как мышь, позиция не меняется в рекурсивной цепи, имеет больше смысла, чтобы дать положение мыши в качестве аргумента передать._private_ManageInput() метод, который дает ускорение примерно на 30%.

class Renderable:
    # ..
    def _private_ManageInput(self, msg, mouse):
        self.InputEvent(msg)
        for sub in self.subs:
            sub._private_ManageInput(msg)

class View(Renderable):
    # ..
    def _private_ManageInput(self, msg, mouse):
        if mouse is not None:
            if mouse in self.frame:
                self.MouseEvent(msg, mouse)
        Renderable._private_ManageInput(self, msg, mouse)

В визуализируемой класс не реализует реагируя на события mouseevent (как это не определить любой области, где мышь может "ударить"), но метод не нужны аргументы для этого? Мне кажется, довольно грязный.

Можете ли вы сказать мне, как я могу улучшить эту конструкцию?



344
5
задан 5 сентября 2011 в 04:09 Источник Поделиться
Комментарии
1 ответ

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

Я писал подобный ответ некоторое время назад на другой вопрос на переполнение стека. Вы можете прочитать его здесь:
https://stackoverflow.com/questions/7249388/7294148#7294148

3
ответ дан 9 сентября 2011 в 10:09 Источник Поделиться