views:

17

answers:

0

I found some code for a Tkinter status bar. I love this code and want to use it to display the progress of a file download. How would I add this functionality?


Here Is The Code:

import Tkinter

class Meter(Tkinter.Frame):
    def __init__(self, master, width=300, height=20, bg='white', fillcolor='orchid1',\
                 value=0.0, text=None, font=None, textcolor='black', *args, **kw):
                     Tkinter.Frame.__init__(self, master, bg=bg, width=width, height=height, *args, **kw)
    self._value = value

    self._canv = Tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\
                                highlightthickness=0, relief='flat', bd=0)
    self._canv.pack(fill='both', expand=1)
    self._rect = self._canv.create_rectangle(0, 0, 0, self._canv.winfo_reqheight(), fill=fillcolor,\
                                             width=0)
    self._text = self._canv.create_text(self._canv.winfo_reqwidth()/2, self._canv.winfo_reqheight()/2,\
                                        text='', fill=textcolor)
    if font:
        self._canv.itemconfigure(self._text, font=font)

    self.set(value, text)
    self.bind('<Configure>', self._update_coords)

def _update_coords(self, event):
    '''Updates the position of the text and rectangle inside the canvas when the size of
    the widget gets changed.'''
    # looks like we have to call update_idletasks() twice to make sure
    # to get the results we expect
    self._canv.update_idletasks()
    self._canv.coords(self._text, self._canv.winfo_width()/2, self._canv.winfo_height()/2)
    self._canv.coords(self._rect, 0, 0, self._canv.winfo_width()*self._value, self._canv.winfo_height())
    self._canv.update_idletasks()

def get(self):
    return self._value, self._canv.itemcget(self._text, 'text')

def set(self, value=0.0, text=None):
    #make the value failsafe:
    if value < 0.0:
        value = 0.0
    elif value > 1.0:
        value = 1.0
    self._value = value
    if text == None:
        #if no text is specified use the default percentage string:
        text = str(int(round(100 * value))) + ' %'
    self._canv.coords(self._rect, 0, 0, self._canv.winfo_width()*value, self._canv.winfo_height())
    self._canv.itemconfigure(self._text, text=text)
    self._canv.update_idletasks()


def _demo(meter, value):
    meter.set(value)
    if value < 1.0:
        value = value + 0.005
        meter.after(50, lambda: _demo(meter, value))
    else:
        meter.set(value, 'Demo successfully finished')

if __name__ == '__main__':
    root = Tkinter.Tk(className='meter demo')
    m = Meter(root, relief='ridge', bd=3)
    m.pack(fill='x')
    m.set(0.0, 'Starting demo...')
    m.after(1000, lambda: _demo(m, 0.0))
    root.mainloop()