2017-06-11 7 views
1

メディアオーバーレイを処理するために、epubリーダーを更新しようとしています。実行するには、オーバーレイのオーディオを再生すると同時に、読み込まれるテキストを強調表示するという2つのことがあります。オーディオを再生するのは難しくありませんでした。私はpydubモジュールを使ってmp3ファイルやmp4ファイルを切り出し、順番に再生しました。 epubのコンテンツを表示するために、私はgi.repositoryからWebKit.Webviewを使用します。これにより、DOMドキュメントにアクセスできるようになり、DOMドキュメントに含まれる要素を修正することができます。代わりに、私はJavascriptを使用して同じ効果を達成することができます。PythonスレッドまたはサブプロセスでDOMにアクセスする方法

しかし、これはメインの実行スレッドでは機能しますが、メインプロセスからフォークすると、別のスレッドでも、別のプロセスであっても実行されません。

from multiprocessing import Process 

def on_access_dom(self, widget, data=None): 
    if __name__ == '__main__': 
     p = Process(target=self.jsdom) 
     p.start() 
     p.join() 
    #self.jsdom() 


def jsdom(self): 
    cmd = '''node = document.getElementById("f003"); 
     node.innerHTML="<span style='color: red'>red text</span>"; ''' 
    self.viewer.execute_script(cmd) 

アイデアがちょうど赤でテキストを表示することです: 問題を説明するために、私はこれを試してみました。私は後で、epubにCSSで指定された色を使用します。上記の私はjavascriptを使用しています。代わりに、新しいプロセスや新しいスレッドを開始すると、私はメインスレッドで直接jsdomまたはtrydomのいずれかを実行する場合は代わりに私が今

def trydom(self): 
    dom = self.domdoc 
    text_id = 'f003' 
    node = dom.get_element_by_id(text_id) 
    text = node.get_outer_html() 
    angle = text.find('>') 
    start = text[:angle]+' style="color: red">' 
    text = text[angle+1:] 
    node.set_outer_html(start+text) 

によって機能jsdomを置き換えることができます。それは必要に応じてすべて動作します。しかし、新しいスレッドやプロセスでは何も起こりません。

何か不足していますか?スレッドには適用されるはずのGILがどのように犯人になるかわかりませんが、フォークされたプロセスには適用されません。

喜んでお寄せいただきありがとうございます。

答えて

0

答えはMy機能trydomは変更されません https://wiki.gnome.org/Projects/PyGObject/Threading

で発見されました。しかし、on_access_dom今私の問題は、私はGtkのは、あなたが持つ1ではないスレッドから直接UIにアクセスするために好きではないことを学んでいなかったということでした

def wrap_trydom(self): 
    GLib.idle_add(self.trydom) 

とともに

def on_access_dom(self, widget, data=None): 
    red = threading.Thread(target=self.wrap_trydom, daemon=True) 
    red.start() 

のように見えますメインイベントループ。 idle_add関数を使用すると、メインイベントループがアイドルである間にコードを実行することができます。

この回答は他の人にも役立ちます。メディアオーバーレイをサポートするepubリーダーを開発するという私の主な仕事に乗り出しました。

関連する問題