Sample code available for progress bar

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • psbasha
    Contributor
    • Feb 2007
    • 440

    #1

    Sample code available for progress bar

    Hi,

    Can anybody help me in creating a progress bar in the UI using Python -TKinter.


    Thanks
    PSB
  • bartonc
    Recognized Expert Expert
    • Sep 2006
    • 6478

    #2
    Here's one that I wrote about a million years ago. Good for example and it works, but I can no longer vouch for the style:
    Code:
    from Tkinter import *
    from BCDbaseDialog import baseDialog
    
    class progressDialog(baseDialog):
    
        def __init__(self, root, label=""):
            baseDialog.__init__(self, root, title='Progress', label=label)
            self.canceled = False
    
        def CreateWidgets(self, top, label):
            self.frameMain = frameMain = Frame(top, bg=self.bg, borderwidth=2, relief=SUNKEN)
            Label(frameMain, bg=self.bg, text=label, width=24
                  ).grid(row=0, column=0, sticky=EW, columnspan=6, padx=5, pady=10)
    
            self.meter_x = meter_x = 2
            self.meter_len = meter_len = 244
            self.meter = meter = Canvas(frameMain, bg=self.bg, width=meter_len, height=18)
            meter.grid(row=1, column=0, sticky=EW, columnspan=6, padx=20, pady=5)
            self.rect = meter.create_rectangle(2, 2, meter_x, 20, fill="black")
    
            button = Button(frameMain, text='Cancel', command=self.Cancel, takefocus=0)
            button.grid(row=2, column=5, sticky=EW, columnspan=1, padx=15, pady=10)
            frameMain.grid(row=0, column=0) # I tried to get rid of flashing here
    
        def Cancel(self, event=None):
            self.close()
    
        def Run(self, progress):
            delta_p = progress - self.oldprog
            if delta_p >= self.delta_p:
                self.oldprog = progress
                self.meter_x += self.delta_x
                self.meter.coords(self.rect, 2, 2, self.meter_x, 20)
                self.top.update()
            return self.canceled
    
        def SetMax(self, count):
            self.count = count
            if count > self.meter_len:
                self.delta_x = 1
                self.delta_p = count//self.meter_len + 1
            else:
                self.delta_p = 1
                self.delta_x = self.meter_len//count
            self.oldprog = 0
    
    
        def close(self, event=None):
            self.canceled = True
            self.top.destroy()
    
    ##################################
    
        def AddTestButton(self):
            button = Button(self.frameMain, text='test', command=self.test, takefocus=0)
            button.grid(row=2, column=0, sticky=EW, columnspan=1, padx=15, pady=10)
    
        def test(self):
            from time import sleep
            import tkSimpleDialog
            count = tkSimpleDialog.askinteger('Test', 'How many times?', parent=self.top)
            self.SetMax(count)
            st = max(1.0/count * 2, .001)
            for loop in range(count):
                canceled = self.Run(loop)
                if canceled:
                    print 'canceled'
                    break
                sleep(st)
            if not canceled:
                self.close()
            root.destroy()
    
    
    if __name__ == '__main__':
        # test the dialog
        root = Tk()
        testDialog = progressDialog(root, 'Cross Referencing')
        testDialog.AddTestButton()
        root.mainloop()
    #    root.destroy()

    Comment

    • psbasha
      Contributor
      • Feb 2007
      • 440

      #3
      I am getting the following error.I need the module BCDbaseDialog to execute the Progress bar.

      Thanks & Regards
      PSB

      >>>

      Traceback (most recent call last):
      File "C:\Shakil\SAmp leCases\SampleP rogress.py", line 2, in -toplevel-
      from BCDbaseDialog import baseDialog
      ImportError: No module named BCDbaseDialog

      Comment

      • bartonc
        Recognized Expert Expert
        • Sep 2006
        • 6478

        #4
        Originally posted by psbasha
        I am getting the following error.I need the module BCDbaseDialog to execute the Progress bar.

        Thanks & Regards
        PSB

        >>>

        Traceback (most recent call last):
        File "C:\Shakil\SAmp leCases\SampleP rogress.py", line 2, in -toplevel-
        from BCDbaseDialog import baseDialog
        ImportError: No module named BCDbaseDialog
        Sorry about that. Here's that one:
        Code:
        from Tkinter import *
        from tkSimpleDialog import _QueryDialog as QueryDialog
        from tkSimpleDialog import Dialog
        
        
        class baseDialog:
            """Basic dialog window: baseDialog.frameMain is where to put widgets.
            Pass in option title and label; label will span three columns in the
            top row. Over-ride CreateWidgets(self, top, label) to add widgets.
            """
            def __init__(self, root, title="", label=""):
                self.root = root
                self.top = top = Toplevel(root)
                top.configure(borderwidth=2)
                top.geometry("+%d+%d" % (root.winfo_screenwidth()/2,
                                          root.winfo_screenheight()/3))
                self.bg = "white"
                self.fg = "black"
                self.CreateWidgets(top, label)              # Fit widgets into self
                top.resizable(height=FALSE, width=FALSE)    # then lock the size
                top.title(title)
                top.protocol("WM_DELETE_WINDOW", self.close)
                top.update()
        #        top.tkraise()
                top.wm_deiconify()
        
            def CreateWidgets(self, top, label):
                self.frameMain = frameMain = Frame(top, bg=self.bg, borderwidth=2, relief=SUNKEN)
                frameMain.grid(row=0, column=0)
                if label:
                    Label(frameMain, text=label, bg=self.bg, width=24
                          ).grid(row=0, column=0, sticky=EW, columnspan=3, padx=5, pady=5)
        
        
            def close(self, event=None):
                self.top.destroy()
        
        
        class QueryHex(QueryDialog):
        
            errormessage = "Not a hex value"
        
            def getresult(self):
                return int(self.entry.get(), 16)
        
            def validate(self):
                if QueryDialog.validate(self):
                    self.result = hex(self.result)[2:].zfill(4)
                    return 1
                return 0
        
        def askhex(title, prompt, **kw):
            '''get an integer from the user
        
            Arguments:
        
                title -- the dialog title
                prompt -- the label text
                **kw -- see SimpleDialog class
        
            Return value is an integer
            '''
            d = QueryHex(title, prompt, **kw)
            return d.result
        
        
        class QueryStartEndValue(QueryDialog):
        ##    def __init__(self, title, prompt,
        ##                 initialvalue=None,
        ##                 minvalue = None, maxvalue = None,
        ##                 parent = None):
        
            def body(self, mainFrame):
                w = Label(mainFrame, text=self.prompt, justify=LEFT)
                w.grid(row=0, padx=0, sticky=W, columnspan=4)
        
                Label(mainFrame, text="Start").grid(row=1, column=0, sticky=W, padx=5)
                Label(mainFrame, text="End").grid(row=1, column=1, sticky=W, padx=5)
                Label(mainFrame, text="Value").grid(row=1, column=2, sticky=W, padx=5)
        
                self.start = pyvar = StringVar(self)
                self.startEntry = entry = Entry(mainFrame, textvariable=pyvar, width=5)
                entry.grid(row=2, column=0, sticky=EW, padx=5)
                self.end = pyvar = StringVar(self)
                self.endEntry = entry = Entry(mainFrame, textvariable=pyvar, width=5)
                entry.grid(row=2, column=1, sticky=EW, padx=5)
                self.value = pyvar = StringVar(self)
                self.valueEntry = entry = Entry(mainFrame, textvariable=pyvar, width=3)
                entry.grid(row=2, column=2, sticky=W, padx=5)
                if self.initialvalue:
                    pyvar.set(self.initialvalue)
                else:
                    pyvar.set('FF')
                return self.startEntry
        
            def validate(self):
                maxvalue = self.maxvalue or 0xffff
                minvalue = self.minvalue or 0
                a = self.start.get()
                b = self.end.get()
                c = self.value.get()
                if a or b:
                    try:
                        self.startEntry.select_range(0, END)
                        self.initial_focus = self.startEntry
                        i = int(a, 16)
                        if i < minvalue or i > maxvalue:
                            raise ValueError
                        self.endEntry.select_range(0, END)
                        self.initial_focus = self.endEntry
                        a = hex(i)[2:].zfill(4)
                        if b:
                            j = int(b, 16)
                            if j < minvalue or j < i or j > maxvalue:
                                raise ValueError
                        else:
                            raise ValueError
                        self.valueEntry.select_range(0, END)
                        self.initial_focus = self.valueEntry
                        b = hex(j)[2:].zfill(4)
                        if c:
                            i = int(c, 16)
                            if i > 0xff:
                                raise ValueError
                            c = hex(i)[2:].zfill(2)
                        else:
                            self.value.set('FF')
                            self.valueEntry.select_range(0, END)
                            raise ValueError
                    except ValueError:
                        self.bell()
                        return False
                self.result = (a, b, c)
                return True
        
        
        def askblockvalue(title, prompt='', initialvalue=None,
                          minvalue=0, maxvalue=0x7fff, parent=None):
            d = QueryStartEndValue(title, prompt, initialvalue, minvalue, maxvalue, parent)
            return d.result
        
        if __name__ == '__main__':
            # test the dialog
            root = Tk()
        ##    def dialog():
        ##        baseDialog(root, 'test', 'test')
        ##    def dialog():
        ##        print askhex("Dump Address", "Enter starting address", minvalue=0, maxvalue=0xffff)
            def dialog():
                print repr(askblockvalue('Block Fill', 'Use hex: Start < End < $8000', parent=root))
            Button(root, text='Dialog', command=dialog).pack()
            root.mainloop()
        ##    if root:
        ##        root.destroy()

        Comment

        • psbasha
          Contributor
          • Feb 2007
          • 440

          #5
          Thanks for the sample code.

          How can I identify the % of completion of the task thru my progress bar?.Since I will be doing different tasks by calling methods and I have to push my progress status by so much %.


          Thanks
          PSB

          Comment

          Working...