basically when run on windows has no error run in linux, shows attributeerror: 'int' object has no attribute 'insert'. problem anyone?
the insert can found in lap method , self.m.insert(end, self.laps[-1]).
from tkinter import * import time class stopwatch(frame): """ implements 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.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 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 = 10,font=("helvetica", 12),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 label elapsed time. """ self._elapsedtime = time.time() - self._start self._settime(self._elapsedtime) self._timer = self.after(50, self._update) def _settime(self, elap): """ set time string 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 time string 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 stopwatch, ignore if running. """ if not self._running: self._start = time.time() - self._elapsedtime self._update() self._running = 1 def stop(self): """ stop 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 stopwatch. """ self._start = time.time() self._elapsedtime = 0.0 self.laps = [] self._settime(self._elapsedtime) def lap(self): '''makes lap, 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 cronometro e cria arquivo para guardar laps''' arquivo = str(self.e.get()) + ' - ' open(arquivo + self.today + '.txt', 'wb') lapfile: lap in self.laps: lapfile.write((bytes(str(lap) + '\n', 'utf-8'))) def main(): root = tk() root.wm_attributes("-topmost", 1) 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()
it looks interpreter somehow calling lap()
method before calls makewidgets()
, weird because don't see lap()
being called anywhere in provided code. mcve?
instead of initializing self.m
0
in __init__()
, initialize value it's supposed have: listbox
widget.
- remove
self.m = 0
__init__()
- move
self.m = listbox(self,selectmode=extended, height = 10,font=("helvetica", 12),yscrollcommand=scrollbar.set)
makewidgets()
__init__()
makewidgets()
ever called once anyway, maybe put __init__()
unless you're planning on expanding program call makewidgets()
more once.