在线程中显示对话框

3

我有一个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()

我还有一个显示对话框的函数。

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 正在运行。

2个回答

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

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接