Здравствуйте, 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
Но во-первых это было дохера лет тому назад, во-вторых я и сам уже не помню как это нафиг работает =)))) Там куча реализаций всяких бихевиоров на питоне =). В общем оно мне уже давно не надо, а разбираться влом.
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)
Есть большое желание прикрутить 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)
Окно появляется, но после нажатия на кнопку в консоль выводится
т. е. событий BUTTON_PRESS, BUTTON_CLICK не видно. Есть какие-нибудь идеи почему могут не приходить события?
Возможно конечно что с маршаллингом данных из си какие-то проблемы, но в си приложении при нажатии на кнопку приходят четыре события — 32769, 1, 32768, 0.
Может быть какие-то проблемы с win32gui, уже нарвался на то что WM_CREATE в wndproc он не пробрасывает. HTMLayout кроме WM_CREATE ожидает еще что-нибудь при создании окна?
Скорости обработки ему не хватает что ли...
Если зажать кнопку то через какое-то время наичнает приходить BUTTON_PRESS, если ставить фильтр на сообщния HANDLE_BEHAVIOR_EVENT вместо HANDLE_ALL, такое ощущение что гораздо шустрее начинает реагировать, но всё равно BUTTON_PRESS приходит только после зажатия кнопки, а BUTTON_CLICK я так и не видел.
Видимо придётся всё-таки делать какую-то обертку на си с расширенными фильтрами чтобы с одной стороны функциональность была досутпна из питона, с другой работало достаточно шустро для HTMLayout. Заодно создание окна и wndproc туда засунуть. Но тут уже придется над интерфейсами думать.
Здравствуйте, Alexéy Sudáchen, Вы писали:
AS>Я это дело в 2007-2008-ом годах делал, но потом забросил. Каких либо проблем с производительностью не обнаружил. Могу послать сырки мылом, там довольно много кода.
Круто! Конечно, выкладывай их куда-нибудь, ну или отправь мне на gmail (ник такой же как на форуме), лишними не будут точно.
Re[2]: Интеграция с питоном
От:
Аноним
Дата:
20.06.11 08:03
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>? Ты уверен что "return False" у тебя возвращает FALSE что есть 0 здесь:
Действительно, возврат нуля вместо False помог.