0

WebKitGTK+ プロジェクトを C++ から Python (PyGI を使用) に変換しています。<input>ページ上の要素がフォーカスを得たり失ったりするたびに検出する必要があります。C++ プロジェクトでは、このコードを使用して実行しました (この例に基づく):

WebKitDOMDocument* document = webkit_web_view_get_dom_document(view);
WebKitDOMNodeList* nodes = webkit_dom_document_get_elements_by_tag_name(document, "*");
int len = webkit_dom_node_list_get_length(nodes);
for(int i = 0; i < len; i++) {
    WebKitDOMNode* node = webkit_dom_node_list_item(nodes, i);
    if(WEBKIT_DOM_IS_HTML_INPUT_ELEMENT(node)) {
        webkit_dom_event_target_add_event_listener(WEBKIT_DOM_EVENT_TARGET(node), "focus", G_CALLBACK(inputFocus), false);
        webkit_dom_event_target_add_event_listener(WEBKIT_DOM_EVENT_TARGET(node), "blur", G_CALLBACK(inputBlur), false);
    }
}

Pythonで同じことをやろうとしたところ、次のようになりました。

document = view.get_dom_document()
nodes = document.get_elements_by_tag_name('*')
for i in range(nodes.get_length()):
    node = nodes.item(i)
    if isinstance(node, WebKit.DOMHTMLInputElement):
        node.add_event_listener('focus', inputFocus, False)

問題は、メソッドDOMHTMLInputElementがないことです。add_event_listenerCバインディングに基づいて、それはDOMEventTarget(拡張する)の一部である必要がありますが、何らかの形で組み込まれていますが、DOMHTMLInputElement一緒に欠落しています。これは、この WebKit バグによる可能性があります。よくわかりませんremove_event_listenerdispatch_event

Pythonでこれを行う方法はありますか? C++ で使用していたのと同じスキームを使用する必要はありません。ページ上の特定の要素でフォーカスが変更されるたびに呼び出すコールバックを登録する何らかの方法が必要なだけです。

4

2 に答える 2

0

私の理解では、これらの関数はイントロスペクション用に公開されていないため、Python では使用できません。私も同じ問題に遭遇し、問題を回避するハックな方法を見つけました。それは私にとってはうまくいきました。

  1. JavaScript を使用して、関心のあるイベントをリッスンします。JavaScriptイベントハンドラー関数でアラート関数を呼び出します。

    alert("FOCUS:"+ node.getId()); //Or name or whatever that can help python side to identify

  2. Python 側では、アラート ハンドラを使用してメッセージを取得し、メッセージを解析してどのノードかを特定します。

name/id または xpath のいずれかで一意のノードを識別できない場合、これは機能しませんが、html を制御している場合は、この問題を簡単に処理できます。

サンプル コードはhttps://github.com/nhrdl/notesMD/blob/master/notesmd.pyにあります。ファイルのアラート機能を見てください。HTML ファイルはアラートを呼び出すだけで、Python 側がメッセージを解析して処理します。

于 2013-06-26T18:15:03.297 に答える