1#! /usr/bin/env python 2 3# Simulate "electrons" migrating across the screen. 4# An optional bitmap file in can be in the background. 5# 6# Usage: electrons [n [bitmapfile]] 7# 8# n is the number of electrons to animate; default is 30. 9# 10# The bitmap file can be any X11 bitmap file (look in 11# /usr/include/X11/bitmaps for samples); it is displayed as the 12# background of the animation. Default is no bitmap. 13 14from Tkinter import * 15import random 16 17 18# The graphical interface 19class Electrons: 20 21 # Create our objects 22 def __init__(self, n, bitmap = None): 23 self.n = n 24 self.tk = tk = Tk() 25 self.canvas = c = Canvas(tk) 26 c.pack() 27 width, height = tk.getint(c['width']), tk.getint(c['height']) 28 29 # Add background bitmap 30 if bitmap: 31 self.bitmap = c.create_bitmap(width/2, height/2, 32 bitmap=bitmap, 33 foreground='blue') 34 35 self.pieces = [] 36 x1, y1, x2, y2 = 10,70,14,74 37 for i in range(n): 38 p = c.create_oval(x1, y1, x2, y2, fill='red') 39 self.pieces.append(p) 40 y1, y2 = y1 +2, y2 + 2 41 self.tk.update() 42 43 def random_move(self, n): 44 c = self.canvas 45 for p in self.pieces: 46 x = random.choice(range(-2,4)) 47 y = random.choice(range(-3,4)) 48 c.move(p, x, y) 49 self.tk.update() 50 51 # Run -- allow 500 movemens 52 def run(self): 53 try: 54 for i in range(500): 55 self.random_move(self.n) 56 except TclError: 57 try: 58 self.tk.destroy() 59 except TclError: 60 pass 61 62 63# Main program 64def main(): 65 import sys, string 66 67 # First argument is number of electrons, default 30 68 if sys.argv[1:]: 69 n = string.atoi(sys.argv[1]) 70 else: 71 n = 30 72 73 # Second argument is bitmap file, default none 74 if sys.argv[2:]: 75 bitmap = sys.argv[2] 76 # Reverse meaning of leading '@' compared to Tk 77 if bitmap[0] == '@': bitmap = bitmap[1:] 78 else: bitmap = '@' + bitmap 79 else: 80 bitmap = None 81 82 # Create the graphical objects... 83 h = Electrons(n, bitmap) 84 85 # ...and run! 86 h.run() 87 88 89# Call main when run as script 90if __name__ == '__main__': 91 main() 92