Emitting signals from a thread will run the handler in the same thread. You shouldn't call gtk functions from a thread other than the main one. If you insist on doing so you have to make sure to acquire the GDK lock first by wrapping your code in gtk.gdk.threads_enter() ... gtk.gdk.threads_leave() calls. In this case you also have to call gtk.gdk.thread_init() as otherwise the main loop will never release the GDK lock. The easier solution is to push the signal emission to the main thread by replacing self.emit('ASignal') with gobject.idle_add(self.emit, 'ASignal') which guarantees the handler will also run in the main thread (which already has the GDK lock).
Regards. On Thu, Jul 25, 2013 at 4:56 PM, Todong Ma <gbstac...@gmail.com> wrote: > Hi, everyone > > I met a problem that UI will be blocked forever if I emit a signal from a > thread to create a message dialog. > Following code will reproduce the issue, please let me give a short > explanation: AThread thread defines a custom signal named "ASignal", and > the signal handler is aSignal() function of MainWindow class. The aSignal() > function is used to display a message dialog. Emitting "ASignal" signal > will display the message dialog successfully but the UI is blocked forever. > > import gtk > import gobject > import threading > > class AThread(threading.Thread, gobject.GObject): > __gsignals__ = { > 'ASignal': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()) > } > def __init__(self): > threading.Thread.__init__(self) > gobject.GObject.__init__(self) > > def run(self): > self.emit('ASignal') > > class MainWindow(gtk.Window): > def aSignal(self, obj): > dialog = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, > gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, 'asdfasf') > dialog.run() > dialog.destroy() > > gobject.threads_init() > > w = MainWindow() > > t = AThread() > t.connect('ASignal', w.aSignal) > t.start() > > gtk.main() > > > Any suggestion is appreciated. > > Thanks, > > _______________________________________________ > pygtk mailing list pygtk@daa.com.au > http://www.daa.com.au/mailman/listinfo/pygtk > Read the PyGTK FAQ: http://faq.pygtk.org/ >
_______________________________________________ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/