Doing a binary watch with python and pygame

There are 10 different types of people in this world - those that can read binary and those that can`t !

I presented the outcome of the code below to around 5 people. Only 2 understood what it was. I must say however that all 5 supposedly are IT professionals.

Here is a small solution you can copy and use to create some binary watch. It should be easy to add some features like config files or change colors or layout. Two screens to demonstrate how it may look like

or rather showing only the "on bits"

It was just a hack, taking some hour or so.

import pygame, ConfigParser
from pygame import *
from time import localtime

class BinaryTile:
    def __init__(self, position, size=48):
        self.image = pygame.Surface((size, size)).convert()
        self.position=position
        self.setToOff()

    def setToOff(self):
        self.color = Color('gray')
        self.image.fill(self.color)

    def setToOn(self):
        self.color = Color('white')
        self.image.fill(self.color)

    def draw(self, screen): 
        screen.blit(self.image, self.position)

class BinaryWatch():
    """ a binary watch """
    def __init__(self, screensize, dotsize):
        pygame.time.set_timer(USEREVENT, 1000)
        #self.time=localtime()
        self.binaryOn={'1':[0], '2':[1], '3':[0, 1], '4':[2], '5':[0, 2], \
                   '6':[1, 2], '7':[0, 1, 2], '8':[3], '9':[0, 3]}
        width_step=screensize[0]/10
        height_step=screensize[1]/10
        xStart=screensize[0]*1/5
        yStart=screensize[1]*3/4-dotsize
        self.bts=[]

        for i in range(0, 2):
            self.appendTile(i,0,xStart, yStart, width_step, height_step, dotsize)
        for i in range(0, 4):
            self.appendTile(i,1,xStart, yStart, width_step, height_step, dotsize)
        for i in range(0, 3):
            self.appendTile(i,2,xStart, yStart, width_step, height_step, dotsize)
        for i in range(0, 4):
            self.appendTile(i,3,xStart, yStart, width_step, height_step, dotsize)
        for i in range(0, 3):
            self.appendTile(i,4,xStart, yStart, width_step, height_step, dotsize)
        for i in range(0, 4):
            self.appendTile(i,5,xStart, yStart, width_step, height_step, dotsize)

    def appendTile(self,index,column, xStart, yStart, width_step, height_step, dotsize):
        divider=0
        if index>0:
            divider = 10
        self.bts.append(BinaryTile((xStart+column*width_step, yStart-index*(height_step+divider)), dotsize))

    def setTilesOnTime(self, time, tilestarttens, tilestartones):
        ones=time % 10
        tens=time / 10
        set=self.binaryOn.get(str(ones))
        if set != None:
            for tile in set:
                self.bts[tile+tilestartones].setToOn()
        set=self.binaryOn.get(str(tens))
        if set != None:
            for tile in set:
                self.bts[tile+tilestarttens].setToOn()

    def update(self, event):
        if event.type == USEREVENT:
            self.time=localtime()
            for bt in self.bts:
                bt.setToOff()
            time=self.time[5]
            self.setTilesOnTime(time, 13, 16)
            time=self.time[4]
            self.setTilesOnTime(time, 6, 9)
            time=self.time[3]
            self.setTilesOnTime(time, 0, 2)

    def draw(self, screen):
        for bt in self.bts:
            bt.draw(screen)

def main():
   pygame.init()
   flags = 0
   #screensize=(1024, 800)
   #screensize=(800, 600)
   screensize=(640, 480)
   screen = pygame.display.set_mode(screensize, flags)

   timer = pygame.time.Clock()
   binary_watch=BinaryWatch(screensize, dotsize=48)
   pygame.mouse.set_visible(False)

   while 1:
       timer.tick(25)
       for e in pygame.event.get():
           if e.type == QUIT: 
               raise SystemExit, "QUIT"
           elif e.type == KEYDOWN and e.key == K_ESCAPE: 
               raise SystemExit, "ESCAPE"
           else:
               binary_watch.update(e)

       screen.fill([0, 0, 0, 0])
       binary_watch.draw(screen)
       pygame.display.flip()

if(__name__ == "__main__"):
    main()