#! /usr/bin/env python

# Simulate "electrons" migrating across the screen.  
# An optional bitmap file in can be in the background.
#
# Usage: electrons [n [bitmapfile]]
#
# n is the number of electrons to animate; default is 30.
#
# The bitmap file can be any X11 bitmap file (look in
# /usr/include/X11/bitmaps for samples); it is displayed as the
# background of the animation.  Default is no bitmap.

from Tkinter import *
import random


# The graphical interface
class Electrons:

	# Create our objects
	def __init__(self, n, bitmap = None):
		self.n = n
		self.tk = tk = Tk()
		self.canvas = c = Canvas(tk)
		c.pack()
		width, height = tk.getint(c['width']), tk.getint(c['height'])

		# Add background bitmap
		if bitmap:
			self.bitmap = c.create_bitmap(width/2, height/2,
						      bitmap=bitmap,
						      foreground='blue')

		self.pieces = []
		x1, y1, x2, y2 = 10,70,14,74
		for i in range(n):
			p = c.create_oval(x1, y1, x2, y2, fill='red')
			self.pieces.append(p)
			y1, y2 = y1 +2, y2 + 2
		self.tk.update()

	def random_move(self, n):
		c = self.canvas
		for p in self.pieces:
			x = random.choice(range(-2,4))
			y = random.choice(range(-3,4))
			c.move(p, x, y)
		self.tk.update()

	# Run -- allow 500 movemens
	def run(self):
		try:
			for i in range(500):
				self.random_move(self.n)
		except TclError:
			try:
				self.tk.destroy()
			except TclError:
				pass


# Main program
def main():
	import sys, string

	# First argument is number of electrons, default 30
	if sys.argv[1:]:
		n = string.atoi(sys.argv[1])
	else:
		n = 30

	# Second argument is bitmap file, default none
	if sys.argv[2:]:
		bitmap = sys.argv[2]
		# Reverse meaning of leading '@' compared to Tk
		if bitmap[0] == '@': bitmap = bitmap[1:]
		else: bitmap = '@' + bitmap
	else:
		bitmap = None

	# Create the graphical objects...
	h = Electrons(n, bitmap)

	# ...and run!
	h.run()


# Call main when run as script
if __name__ == '__main__':
	main()
