Отображение диалога в теме - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть дополнение 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 голосов
/ 27 сентября 2011

Самый простой способ - запустить self.dialog_notification() в главном потоке gtk. Просто добавьте gobject.idle_add(self.dialog_notification, args...) в вашу ветку.

0 голосов
/ 04 февраля 2015

Ошибка появляется, потому что вы обновляете графический интерфейс из потока.

Вы должны использовать Gdk.threads_enter() и Gdk.threads_leave() (необходимо импортировать Gdk) каждый раз, когда вы получаете доступ к GUI.

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