I have some working code that I altered but I can’t seem to get the math right for the hours variable. I think I had to much food for the holidays because I’m coming up with a blank.
## {{{ http://code.activestate.com/recipes/124894/ (r2)
from Tkinter import *
import time
import pygtk
import gtk
import time
class StopWatch(Frame):
""" Implements a stop watch frame widget. """
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self._start = 0.0
self._elapsedtime = 0.0
self._running = 0
self.timestr = StringVar()
self.makeWidgets()
def makeWidgets(self):
""" Make the time label. """
l = Label(self, textvariable=self.timestr)
self._setTime(self._elapsedtime)
l.pack(fill=X, expand=NO, pady=2, padx=2)
def _update(self):
""" Update the label with elapsed time. """
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._timer = self.after(50, self._update)
def _setTime(self, elap):
""" Set the time string to Minutes:Seconds:Hundreths """
hours = int(elap) #cant remember formula
minutes = int(elap/60)
seconds = int(elap - minutes*60.0)
hseconds = int((elap - minutes*60.0 - seconds)*100)
sn = time.strftime('%m/%d/%Y-%H:%M:%S')
self.timestr.set('%02s\n\n%02dh:%02dm:%02ds:%02d' % (sn,hours,minutes, seconds, hseconds))
def Start(self):
""" Start the stopwatch, ignore if running. """
if not self._running:
self._start = time.time() - self._elapsedtime
self._update()
self._running = 1
def Stop(self):
""" Stop the stopwatch, ignore if stopped. """
if self._running:
self.after_cancel(self._timer)
self._elapsedtime = time.time() - self._start
self._setTime(self._elapsedtime)
self._running = 0
def Reset(self):
""" Reset the stopwatch. """
self._start = time.time()
self._elapsedtime = 0.0
self._setTime(self._elapsedtime)
def main():
root = Tk()
root.title( "Stop Watch" )
sw = StopWatch(root)
sw.pack(side=TOP)
Button(root, text='Start', command=sw.Start).pack(side=LEFT)
Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
Button(root, text='Quit', command=root.quit).pack(side=LEFT)
root.mainloop()
if __name__ == '__main__':
main()
## end of http://code.activestate.com/recipes/124894/ }}}
I infer from the equations that
elapis measured in seconds. Since you are extracting hours into a separate variable, you need to remove them from the minutes tally. And of course you need to follow this through the rest of the calculation since the meaning ofminutesis changed from the original code.I think if I was writing this I would modify
elapas I was going along to reduce the duplication.Doing it this way makes it far easier to see what is going on and also easier to modify in future. For example, if you wanted to add days into the mix then all you need to do is graft this onto the beginning of the code:
Now, I’ve written the code here assuming that
elapis afloat, which of course it is in your program. If you were particularly paranoid you would writeelap = float(elap)before performing the arithmetic.But I agree with @soulcheck that it’s much cleaner to use a library function.