Pygtk, widget refreshing

John Hunter jdhunter at ace.bsd.uchicago.edu
Tue Sep 23 16:25:13 EDT 2003


>>>>> "Arne" == Arne Schwabe <arne at rfc2549.org> writes:

    Arne> hi, I am using python and pygtk.  In my program I want to
    Arne> realize a status thing with a DrawingArea.  But my problem
    Arne> is that this area is not updated while my program is
    Arne> running.  Is there a way I can force pygtk to refresh to
    Arne> widgets?

Two good ways, one is to use a timer and the other an idle.  A timer
will call your function of choice every so many milliseconds, and an
idle func will do it whenever the gtk event loop is idle

For the timer

    def update_widget(*args):
       pass  # do something here

    gtk.timeout_add(250, update_widget)  # call update_widget every 250 ms

For the idle func, you can pass an arg that will be passed to your
idle func

   gtk.idle_add(update_widget) 


Here is how I update a status bar -- this may not be ideal, it's just
what I came up with when I confronted it the first time

Create the status bar

    self.statbar = gtk.Statusbar()
    self.statbar.show()
    self.statbarCID = self.statbar.get_context_id('my stat bar')
    self.vbox.pack_end(self.statbar)
    self.timeoutId  = gtk.timeout_add(5000,self.update_status_bar)

where update_status_bar looks like

    def update_status_bar(self, msg=None):
        if msg is None:
            # generate default message
            
        try: self.statbarCID, self.statbarMID
        except AttributeError: pass
        else: self.statbar.remove(self.statbarCID, self.statbarMID)
            
        self.statbarMID = self.statbar.push(self.statbarCID, msg)
        return gtk.TRUE

and then later when the dialog is destroyed

    gtk.timeout_remove(self.timeoutId)

Hope this helps,
John Hunter    

        






More information about the Python-list mailing list