我有一个pygtk add,它有一个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()
我还有一个显示对话框的功能。
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正在运行。
答案 0 :(得分:2)
最简单的方法是在主gtk线程中运行self.dialog_notification()
。只需在帖子中添加gobject.idle_add(self.dialog_notification, args...)
即可。
答案 1 :(得分:0)
出现错误是因为您正在从线程更新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()