Okay, so I have a for loop with a sleep command. I want the loop to continue
until it is told to stop. I want to tell it to stop when a list goes from
empty to having something. The problem is that when that loop starts, the
program pretty much stops with it. To make things harder, I really want that
to be it's own class, so I have to pass it the list that triggers the
stopping, but I can only pass it the list once. So I don't think it is
possible. But if this made sense to anyone, and you have a suggestion I
would love it. Heres the full code: (but at the bottom, the Open function is
really the only thing that matters)

from Tkinter import *
import time

class BusyBar(Frame):
    def __init__(self, master=None, **options):
        # make sure we have sane defaults
        self.master=master
        self.options=options
        self.width=options.setdefault('width', 300)
        self.height=options.setdefault('height', 20)
        self.background=options.setdefault('background', 'white')
        self.relief=options.setdefault('relief', 'sunken')
        self.bd=options.setdefault('bd', 2)

        #extract options not applicable to frames
        self._extractOptions(options)

        # init the base class
        Frame.__init__(self, master, options)

        self.incr=self.width*self.increment
        self.busy=0
        self.dir='right'

        # create the canvas which is the container for the bar
        self.canvas=Canvas(self, height=self.height, width=self.width, bd=0,
                           highlightthickness=0, background=self.background)
        # catch canvas resizes
        self.canvas.bind('<Configure>', self.onSize)

        # this is the bar that moves back and forth on the canvas
        self.scale=self.canvas.create_rectangle(0, 0,
self.width*self.barWidth, self.height, fill=self.fill, width = 0)

        # label that is in the center of the widget
        self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2,
                                           self.height / 2, text=self.text,
                                           anchor="c", fill=self.foreground,
                                           font=self.font)
        self.update()
        self.canvas.pack(side=TOP, fill=X, expand=NO)

    def _extractOptions(self, options):
        # these are the options not applicable to a frame
        self.foreground=pop(options, 'foreground', 'white')
        self.fill=pop(options, 'fill', 'black')
        self.interval=pop(options, 'interval', 30)
        self.font=pop(options, 'font','arial 12')
        self.text=pop(options, 'text', '')
        self.barWidth=pop(options, 'barWidth', 0.2)
        self.increment=pop(options, 'increment', 0.05)

    # todo - need to implement config, cget, __setitem__, __getitem__ so
it's more like a reg widget
    # as it is now, you get a chance to set stuff at the constructor but not
after

    def onSize(self, e=None):
        self.width = e.width
        self.height = e.height
        # make sure the label is centered
        self.canvas.delete(self.label)
        self.label=self.canvas.create_text(self.width / 2, self.height / 2,
text=self.text,
                                           anchor="c", fill=self.foreground,
font=self.font)

    def on(self):
        self.busy = 1
        self.canvas.after(self.interval, self.update)

    def of(self):
        self.busy = 0

    def update(self):
        # do the move
        x1,y1,x2,y2 = self.canvas.coords(self.scale)
        if x2>=self.width:
            self.dir='left'
        if x1<=0:
            self.dir='right'
        if self.dir=='right':
            self.canvas.move(self.scale, self.incr, 0)
        else:
            self.canvas.move(self.scale, -1*self.incr, 0)

        if self.busy:
            self.canvas.after(self.interval, self.update)
        self.canvas.update_idletasks()

def pop(dict, key, default):
    value = dict.get(key, default)
    if dict.has_key(key):
        del dict[key]
    return value


#if __name__=='__main__':
    
#-----------------------------IMPORTANT
STUFF-------------------------------------------------
def Open(root):

    bb = BusyBar(root, text='Grabbing Definitions')
    bb.pack(side=LEFT, expand=NO)

    bb.on()
    root.update_idletasks()
    for i in range(0, 100):
        time.sleep(0.1)
        root.update()
    bb.of()

and the Open fucntion is with I would be calling from another program. 
-- 
View this message in context: 
http://www.nabble.com/Stopping-a-for-loop-with-a-sleep%28%29-funciton-in-it-tp18391735p18391735.html
Sent from the Python - tkinter-discuss mailing list archive at Nabble.com.

_______________________________________________
Tkinter-discuss mailing list
Tkinter-discuss@python.org
http://mail.python.org/mailman/listinfo/tkinter-discuss

Reply via email to