Hi,
Can anybody help me in creating a progress bar in the UI using Python -TKinter.
Thanks
PSB
Can anybody help me in creating a progress bar in the UI using Python -TKinter.
Thanks
PSB
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()
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