在线程中显示对话框

我有一个pygtk添加其中有一个gtk.Button(),当按下必须做5秒的工作。 所以, 信号处理程序中实现时间密集型函数的思想是一个线程。

首先,我在开头添加了gtk.gdk.threads_init()。

我的信号处理程序是def send_sms() ,我有另一个函数def send_sms_mycantos() ,我称之为线程。

threading.Thread(target = self.send_sms_mycantos, args=(phone_no, message_text, username, password)).start() 

我也有一个显示对话框的function。

 def dialog_notification(self, message, dialog_type): dlg = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, dialog_type, gtk.BUTTONS_CLOSE, message) dlg.run() dlg.destroy() 

现在,如果我在我的线程中调用上述函数

 self.dialog_notification("Message sent successfully", gtk.MESSAGE_INFO) 

我得到这个错误。

 SMSSender.py: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 

这是实施线程的正确方法吗? 我究竟做错了什么。 错误就像线程不知道Xserver正在运行。

最简单的方法是在主gtk线程中运行self.dialog_notification() 。 只需在你的线程中添加gobject.idle_add(self.dialog_notification, args...)

出现此错误是因为您正在从线程更新GUI。

每次访问GUI时,都应该使用Gdk.threads_enter()Gdk.threads_leave() (您必须导入Gdk)。

 def dialog_notification(self, message, dialog_type): dlg = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, dialog_type, gtk.BUTTONS_CLOSE, message) Gdk.threads_enter() dlg.run() Gdk.threads_leave() Gdk.threads_enter() dlg.destroy() Gdk.threads_leave()