from tkinter import * 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.lapstr = StringVar() self.e = 0 self.m = 0 self.makeWidgets() self.laps = [] self.lapmod2 = 0 self.today = time.strftime("%d %b %Y %H-%M-%S", time.localtime()) def makeWidgets(self): """ Make the time label. """ l1 = Label(self, text='----File Name----') l1.pack(fill=X, expand=NO, pady=1, padx=2) self.e = Entry(self) self.e.pack(pady=2, padx=2) l = Label(self, textvariable=self.timestr) self._setTime(self._elapsedtime) l.pack(fill=X, expand=NO, pady=3, padx=2) l2 = Label(self, text='----Laps----') l2.pack(fill=X, expand=NO, pady=4, padx=2) scrollbar = Scrollbar(self, orient=VERTICAL) self.m = Listbox(self,selectmode=EXTENDED, height = 5, yscrollcommand=scrollbar.set) self.m.pack(side=LEFT, fill=BOTH, expand=1, pady=5, padx=2) scrollbar.config(command=self.m.yview) scrollbar.pack(side=RIGHT, fill=Y) 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 """ minutes = int(elap/60) seconds = int(elap - minutes*60.0) hseconds = int((elap - minutes*60.0 - seconds)*100) self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds)) def _setLapTime(self, elap): """ Set the time string to Minutes:Seconds:Hundreths """ minutes = int(elap/60) seconds = int(elap - minutes*60.0) hseconds = int((elap - minutes*60.0 - seconds)*100) return '%02d:%02d:%02d' % (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.laps = [] self._setTime(self._elapsedtime) def Lap(self): '''Makes a lap, only if started''' tempo = self._elapsedtime - self.lapmod2 if self._running: self.laps.append(self._setLapTime(tempo)) self.m.insert(END, self.laps[-1]) self.m.yview_moveto(1) self.lapmod2 = self._elapsedtime def GravaCSV(self): '''Pega nome do cronometro e cria arquivo para guardar as laps''' arquivo = str(self.e.get()) + ' - ' with open(arquivo + self.today + '.txt', 'wb') as lapfile: for lap in self.laps: lapfile.write((bytes(str(lap) + '\n', 'utf-8'))) def main(): root = Tk() root.wm_attributes("-topmost", 1) #always on top - might do a button for it sw = StopWatch(root) sw.pack(side=TOP) Button(root, text='Lap', command=sw.Lap).pack(side=LEFT) 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='Save', command=sw.GravaCSV).pack(side=LEFT) Button(root, text='Quit', command=root.quit).pack(side=LEFT) root.mainloop() if __name__ == '__main__': main()