Re: Интеграция с питоном
От: Alexéy Sudáchen Чили  
Дата: 19.06.11 11:58
Оценка: 3 (1)
Здравствуйте, zaichatki, Вы писали:

Z>Есть большое желание прикрутить HTMLayout к питону. Поиском нашел что вопрос пару раз поднимался, но насколько я понял никто так и не взялся.



Я это дело в 2007-2008-ом годах делал, но потом забросил. Каких либо проблем с производительностью не обнаружил. Могу послать сырки мылом, там довольно много кода.

собственно оконная процедура у меня была такая

    def WindowProc(self,hwnd,umsg,wparam,lparam):
        handled = BOOL(0)

        if hwnd != self.hwnd or umsg not in (WM_SETTEXT,WM_CLOSE):
            r = HTMLayoutProcND(hwnd,umsg,wparam,lparam,byref(handled))

        if not handled.value:
            if umsg == WM_BEHAVIOR_NOTIFY: # see behaviors/notifications.h
                hdr = NMHDR.from_address(lparam)
                if HLN_HYPERLINK == hdr.code:
                    hlink = NMHL_HYPERLINK.from_address(lparam)
                    if hlink.action == NMHL_HYPERLINK_CLICK:
                        return RouteDelegator(self._ac_map,HLN_HYPERLINK,self,DOMElement(hlink.he),hlink.szHREF);
                elif HLN_COMMAND_CLICK == hdr.code:
                    cmd = NMHL_COMMAND_CLICK.from_address(lparam)
                    return RouteDelegator(self._ac_map,HLN_COMMAND_CLICK,self,DOMElement(cmd.he),cmd.szElementID);
                elif HLN_TABLE_SELECT_SET == hdr.code:
                    cmd = NMHL_TABLE_SELECT_SET.from_address(lparam)
                    return RouteDelegator(self._ac_map,HLN_TABLE_SELECT_SET,self,DOMElement(cmd.he),cmd.index_list,cmd.index_count)
                #elif HLN_TABLE_SELECT_ADD == hdr.code:
                #    cmd = NMHL_TABLE_SELECT_ADD.from_address(lparam)
                #    return RouteDelegator(self._ac_map,HLN_TABLE_SELECT_ADD,self,DOMElement(cmd.he),cmd.index)
            return MSWindow.WindowProc(self,hwnd,umsg,wparam,lparam)

        return r


Но во-первых это было дохера лет тому назад, во-вторых я и сам уже не помню как это нафиг работает =)))) Там куча реализаций всяких бихевиоров на питоне =). В общем оно мне уже давно не надо, а разбираться влом.
Re: Интеграция с питоном
От: c-smile Канада http://terrainformatica.com
Дата: 19.06.11 17:31
Оценка: 2 (1)
Здравствуйте, zaichatki, Вы писали:

Z>Окно появляется, но после нажатия на кнопку в консоль выводится

Z>
Z>btn 32768:  00 80 00 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00
Z>btn 65536:  00 00 01 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00
Z>

Z>т. е. событий BUTTON_PRESS, BUTTON_CLICK не видно. Есть какие-нибудь идеи почему могут не приходить события?
Z>Возможно конечно что с маршаллингом данных из си какие-то проблемы, но в си приложении при нажатии на кнопку приходят четыре события — 32769, 1, 32768, 0.

32769 (0x8001) это (BUTTON_PRESS | SINKING)
1 (0x0001) это (BUTTON_PRESS)
32768 (0x8000) это (BUTTON_CLICK | SINKING)
0 это и есть (BUTTON_CLICK)

В твоем примере:

32768 — (BUTTON_CLICK | SINKING)
65536 — (BUTTON_CLICK | HANDLED)

(BUTTON_CLICK | HANDLED) означает что кто-то обработал (потребил,consume) данное событие.

? Ты уверен что "return False" у тебя возвращает FALSE что есть 0 здесь:

def event_callback(tag, elem, event, params):
    if event == HANDLE_BEHAVIOR_EVENT:
        id = HTMLayoutGetAttributeByName(elem, "id")
        bp = cast(params, POINTER(BEHAVIOR_EVENT_PARAMS)).contents
        print "%s %d:  %s" % (id, bp.cmd, ByteToHex(buffer(bp)))
    return False


Если оно возвращает не ноль это означает что событие было consumed тобой самим.
Интеграция с питоном
От: zaichatki  
Дата: 19.06.11 09:14
Оценка:
Есть большое желание прикрутить HTMLayout к питону. Поиском нашел что вопрос пару раз поднимался, но насколько я понял никто так и не взялся.
Пытаюсь пока прикрутить обвязку к си интерфейсу (через ctypes), вроде бы почти завелось но какие-то кривые события в обработчик приходят.
Тестовый код выглядит примерно так:
def wndproc(hWnd, message, wParam, lParam):
    (handled, res) = HTMLayoutProcND(hWnd, message, wParam, lParam)
    if handled:
        return res
    if message == WM_CLOSE or message == WM_DESTROY:
        win32gui.PostQuitMessage(0)
    return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

def event_callback(tag, elem, event, params):
    if event == HANDLE_BEHAVIOR_EVENT:
        id = HTMLayoutGetAttributeByName(elem, "id")
        bp = cast(params, POINTER(BEHAVIOR_EVENT_PARAMS)).contents
        print "%s %d:  %s" % (id, bp.cmd, ByteToHex(buffer(bp)))
    return False

...
hWnd = win32gui.CreateWindow("HTMLayoutDemo", ...
HTMLayoutProcND(hWnd, WM_CREATE, 0, 0) # Костыль для win32gui - WN_CREATE не приходит в wndproc
win32gui.ShowWindow(hWnd, SW_SHOWNORMAL)
HTMLayoutLoadHtml(hWnd, "<html><body>Hello world!!<p/><button id='btn'>Press me</button></body></html>")
HTMLayoutWindowAttachEventHandler(hWnd, event_callback, 0, HANDLE_ALL)


Окно появляется, но после нажатия на кнопку в консоль выводится
btn 32768:  00 80 00 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00
btn 65536:  00 00 01 00 A8 D9 B3 01 A8 D9 B3 01 01 00 00 00

т. е. событий BUTTON_PRESS, BUTTON_CLICK не видно. Есть какие-нибудь идеи почему могут не приходить события?
Возможно конечно что с маршаллингом данных из си какие-то проблемы, но в си приложении при нажатии на кнопку приходят четыре события — 32769, 1, 32768, 0.
Может быть какие-то проблемы с win32gui, уже нарвался на то что WM_CREATE в wndproc он не пробрасывает. HTMLayout кроме WM_CREATE ожидает еще что-нибудь при создании окна?
Re: Интеграция с питоном
От: zaichatki  
Дата: 19.06.11 09:59
Оценка:
Скорости обработки ему не хватает что ли...
Если зажать кнопку то через какое-то время наичнает приходить BUTTON_PRESS, если ставить фильтр на сообщния HANDLE_BEHAVIOR_EVENT вместо HANDLE_ALL, такое ощущение что гораздо шустрее начинает реагировать, но всё равно BUTTON_PRESS приходит только после зажатия кнопки, а BUTTON_CLICK я так и не видел.

Видимо придётся всё-таки делать какую-то обертку на си с расширенными фильтрами чтобы с одной стороны функциональность была досутпна из питона, с другой работало достаточно шустро для HTMLayout. Заодно создание окна и wndproc туда засунуть. Но тут уже придется над интерфейсами думать.
Re[2]: Интеграция с питоном
От: zaichatki  
Дата: 19.06.11 14:19
Оценка:
Здравствуйте, Alexéy Sudáchen, Вы писали:

AS>Я это дело в 2007-2008-ом годах делал, но потом забросил. Каких либо проблем с производительностью не обнаружил. Могу послать сырки мылом, там довольно много кода.

Круто! Конечно, выкладывай их куда-нибудь, ну или отправь мне на gmail (ник такой же как на форуме), лишними не будут точно.
Re[2]: Интеграция с питоном
От: Аноним  
Дата: 20.06.11 08:03
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>? Ты уверен что "return False" у тебя возвращает FALSE что есть 0 здесь:

Действительно, возврат нуля вместо False помог.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.