2011-12-06 37 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下,它們根本不支持線程。所以,試圖與他們合作最終會成爲一種痛苦。您可以通過使用Python generatorsgobject.idle_add() method

作爲替代自己的編碼,你也可以只用Zenity,這是命令行啓動通知對話框侏儒節目「作假」得到一些非常不錯的結果。這應該是線程安全的。

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

是否可以在程序過程中使用'gobject.idle_add()'?它並非如此。有其他選擇嗎?我目前正在使用全局變量更改的可怕方法,並且在運行另一個循環時執行一個無止境的'gobject.timeout_add()'方法來執行通知系統。 – Paul

+0

當然,但是一定要通過'gobject.idle_add()'你的生成器的'next'方法(即'gobject.idle_add(myfakethread.next)'),然後在你的生成器中,只要你想要'yield True'假線程運行並在完成時產生「假」。 – 2011-12-07 17:02:54

+0

當傳遞給'gobject.idle_add()'的方法返回True時,它計劃再次由GObject運行。當它返回False時,它不會再執行。因此,每次調用'yield True',從某種意義上說,將控制權從假線程放棄到GObject,並且充當下一次GObject停機時假線程將恢復的點。 – 2011-12-07 17:06:54