在线程中显示对话框

2024-03-29 13:42:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pygtk add,它有一个gtk.按钮()当按下它时,它必须做一个工作,比如说5秒钟。因此,将信号处理程序中的时间密集型函数作为线程实现的思想。在

首先,我补充了gtk.gdk.threads_初始化()一开始。在

我的信号处理程序是def send_sms(),其中我有另一个函数def send\u sms_mycantos(),我将其作为线程调用。在

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

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

^{pr2}$

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

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

我得到这个错误。在

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

这是实现线程化的正确方法吗。我做错什么了。这个错误就像线程不知道Xserver正在运行一样。在


Tags: 函数self程序sendaddgtkdef错误
2条回答

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

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

每次访问GUI时都应该使用Gdk.threads_enter()和{}(必须导入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()

相关问题 更多 >