Tkinter and a clock

Matthew Dixon Cowles matt at mondoinfo.com
Mon Sep 3 21:36:44 CEST 2001


On 2 Sep 2001 21:51:25 -0700, rob shugg <shuggy at volcanomail.com>
wrote:

>I have an application where I need to display a clock during a data
>acquisition operation. The clock needs to display seconds and I need
>to be able to start stop and reset it like a stopwatch. I have been
>reading about threading issues with Tkinter and am wondering what
>aproach to take. Can someone give me some pointers?

Dear Rob,
The easiest thing would be to use Tkinter's alarm-style event. I'll
append a simple example of how it might be done. There aren't any
guarantees about when your code will be called but then there aren't
any guarantees about when a thread will be executed either.

Fredrik Lundh's excellent An Introduction to Tkinter provides good
documentation for it. It's at:

http://www.pythonware.com/library/tkinter/introduction/index.htm

Indeed, the whole document is very valuable to anyone doing Tkinter
programming. I've long since saved a copy locally to save Fredrik the
bandwidth.

Regards,
Matt



#!/usr/local/bin/python

import time
from Tkinter import *

class mainWin:

  def __init__(self,root):
    self.root=root
    self.createWidgets()
    self.clockStartedAt=None
    self.timeAccumulated=None
    self.afterID=None
    return None

  def createWidgets(self):
    b=Button(self.root,text="Start",command=self.startClock)
    b.pack()
    b=Button(self.root,text="Stop",command=self.stopClock)
    b.pack()
    b=Button(self.root,text="Reset",command=self.resetClock)
    b.pack()
    self.clockDisplay=Label(self.root,width=20,borderwidth=2,relief=GROOVE)
    self.clockDisplay.pack()
    return None

  def startClock(self):
    self.clockStartedAt=time.time()
    self.afterID=self.root.after(200,self.updateClock)
    return None

  def updateClock(self):
    val=time.time()-self.clockStartedAt
    if self.timeAccumulated<>None:
      val=val+self.timeAccumulated
    self.clockDisplay.configure(text=str(int(val)))
    self.afterID=self.root.after(200,self.updateClock)
    return None

  def stopClock(self):
    self.timeAccumulated=time.time()-self.clockStartedAt
    self.clockStartedAt=None
    if self.afterID<>None:
      self.root.after_cancel(self.afterID)
    self.afterID=None
    return None

  def resetClock(self):
    self.clockStartedAt=None
    self.timeAccumulated=None
    self.clockDisplay.configure(text="")
    return None

def main():
  root=Tk()
  mainWin(root)
  root.mainloop()
  return None

if __name__=='__main__':
  main()




More information about the Python-list mailing list