2011-12-06 35 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