2016-05-03 12 views
1

私はこのようになります私の主な用途での機能を持っています。GTK + 3 + Pythonの:「ロード...」ダイアログ

def foo(stuff): 

    a_line_that_takes_a_while(stuff) 

    return result 

私はa_line_that_takes_a_while前に表示し、破壊するためにダイアログを追加しようとしていますその行の直後に実行されました。

私が試してみた:

def foo(stuff): 
    dialog = Gtk.MessageDialog(...) 
    dialog.show_all() 

    a_line_that_takes_a_while(stuff) 

    dialog.destroy() 

    return result 

をしかしa_line_that_takes_a_whileがすでに実行されたとき、驚くほど、ダイアログだけ表示されます。もちろん、それは私のアプリケーションのメインループをブロックするので、dialog.run()を使用することはできません。

アイデア?

+0

私は最近、この同じ質問のCバージョンに回答しました:http://stackoverflow.com/questions/36971139/gui-becomes-unresponsive-after-clicking-the-button-using-gtk-in-c – ebassi

答えて

3

GTKへの呼び出しが実際に行っているのは、メインループ中に発生するアクションをキューに入れることだけです。ダイアログは、dialog.run()を特定の更新を許可するブロックに呼び出すときの特殊なケースです。あなたのfoo関数はGTKに対話を作成させ、それを破棄してから作業を開始しようとします。

Threadsを実行してください。 GTKはスレッドセーフではありません。したがって、ネイティブのPythonスレッドを使用することにした場合は注意が必要です。また、ディスク操作を行っている場合は、GFileの非同期コールバックを考慮してください。彼らはあなたにホイールを再発明するのを少し保存するかもしれません。

関連する問題