[pygtk] UI will be blocked if creating a message dialog by emitting a signal

Todong Ma gbstack08 at gmail.com
Thu Jul 25 23:40:10 WST 2013


Thanks a lot, it works now! So far I'm using a really stupid method: 
using gobject.timeout_add() to check a global flag variable every 0.1 
seconds, if the flag is set, the message dialog will be shown.. But now 
they can be fixed:)

On 2013/7/25 23:15, Niklas Koep wrote:
> 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 <gbstack08 at gmail.com 
> <mailto:gbstack08 at 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 at daa.com.au <mailto:pygtk at daa.com.au>
>     http://www.daa.com.au/mailman/listinfo/pygtk
>     Read the PyGTK FAQ: http://faq.pygtk.org/
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.daa.com.au/pipermail/pygtk/attachments/20130725/3bd64653/attachment.html>


More information about the pygtk mailing list