Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pygtk glib.timeout_add(): How to tell if timer not being destroyed?

Tags:

python

pygtk

gtk

In my application I use a function to show GtkInfoBars with a timeout (as described https://stackoverflow.com/a/1309257/406281) thanks to glib.timeout_add_seconds().

I understand that glib.timeout_add_seconds() is supposed to set a function to be called at regular intervals until said function returns False.

I'm not doing that, but everything works as expected. It's perfectly simple. Here's my code:

def infobar(self, message, msgtype=gtk.MESSAGE_INFO, timeout=5):
    bar = gtk.InfoBar()
    bar.set_message_type(msgtype)
    bar.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
    bar.connect("response", lambda *args: bar.hide())
    self.vb2.pack_end(bar, False, False)
    label = gtk.Label()
    label.set_markup(message)
    content = bar.get_content_area()
    content.add(label)
    label.show()
    bar.show()
    if timeout:
        glib.timeout_add_seconds(timeout, bar.hide)

SO. Question time. Look at what I did in the last line. Simply put, is this okay? Will the timeout destroy itself after the second call to bar.hide() fails? Or am I accumulating extra neutered timeouts that will wake up every 5 seconds [technically] using up resources?


As an addendum:

If, as I suspect, this is bad, and I really do need to return False to destroy the timeouts, I need some help -- I can't figure out how to play around with the code in order to satisfy these conditions: I need to allow multiple InfoBars at the same time, with each still staying connected to their own timer and button-response signal (as the code is now) OR I need each new InfoBar to replace any previous one (I can't figure out how to do this without inheriting the timer from the previous InfoBar--it gets messy).

Thanks for reading!

like image 306
rsaw Avatar asked Jan 18 '23 17:01

rsaw


1 Answers

Regarding bar.hide being called more than once, I think that's not happening because, as far as I know, it should be enough to return a value that is evaluated as False and bar.hide returns None which should be enough. However, if you want to make completely sure, you can verify with something like this:

import gtk, glib

def callback():
    print 'called'

glib.timeout_add_seconds(1, callback)
gtk.main()

In this example, the callback returns None as well and is called just once as you can see from the output to stdout.

Regarding your final question, I'd say this is already an acceptable way of having multiple infobars with a separate timer for each one. Please add more information if I'm missing something.

like image 105
jcollado Avatar answered Mar 16 '23 00:03

jcollado