2011-12-06 11 views
3

まず、私はこのテーマでかなり長い時間を捜していると言えます。私はおそらく最も基本的なリソースを知っています。私はこの:https://github.com/woodenbrick/gtkPopupNotifyを使用して、以前のすべてのコマンドラインプログラムに通知システムを追加しようとしています。悲しいことに、これは通常、私がたくさんの睡眠操作などを実行しているためにハングします。基本的に、私が望むのは、他のPyGTKコンポーネントを含むプログラムの他の操作に干渉しない通知を行うことだけです。現時点では、これらの通知を行うための機能は私のために、このように探しています:PyGTKを使ったスレッディング

def showMessage(title, message): 
     notifier1 = gtkPopupNotify.NotificationStack(timeout=4) 
     notifier1.bg_color = gtk.gdk.Color("black") 
     notifier1.fg_color = gtk.gdk.Color("white") 
     notifier1.edge_offset_x = 5-27 #-27 for odd bugginess 
     notifier1.edge_offset_y = 5 
     notifier1.new_popup(title=title, message=message) 

私は本当にこの問題にうんざりになってきていて、任意の助けをいただければ幸いです。

答えて

1

PyGTKでは、スレッドをすべて避けることを強くお勧めします。 GTKライブラリは完全にthread-safeではなく、Win-32ではスレッドをまったくサポートしていません。だから、彼らと一緒に仕事をしようとすると痛みに終わります。あなたはまた、単にコマンドラインからの通知ダイアログを起動するためのGnomeのプログラムである、Zenityを使用することができ、それを自分でコーディングする代わりにPython generatorsgobject.idle_add() method

を使用して、「それを偽造」することによって、いくつかの本当に良い結果を得ることができます。これはスレッドセーフである必要があります。

import subprocess 
subprocess.call(["zenity", "--notification", "--text=You have been notified"]) 
+0

gobject.idle_add()はプログラムの中で使用できますか?それはそうではありません。代わりがありますか?私は現在、大域変数の変化の恐ろしいメソッドと、別のループを実行しているときに通知システムを実行するために終了しない 'gobject.timeout_add()'メソッドを使用しています。 – Paul

+0

絶対に、あなたのジェネレータの 'next'メソッド(' gobject.idle_add(myfakethread.next) ')を' gobject.idle_add() 'に渡してから、あなたのジェネレータで、完了すると、実行する偽のスレッドと 'Falseを返す '。 –

+0

'gobject.idle_add()'に渡されたメソッドがTrueを返すと、GObjectによって再度実行されるようにスケジュールされます。 Falseを返すと、再度実行されません。したがって、 'yield True'への各呼び出しは、ある意味では、偽のスレッドからGObjectへの制御を放棄し、GObjectが次にダウンタイムを持つときに偽のスレッドが再開するポイントとして機能します。 –