Home | History | Annotate | Download | only in guido
      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 
     14 from Tkinter import *
     15 import random
     16 
     17 
     18 # The graphical interface
     19 class 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
     64 def 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
     90 if __name__ == '__main__':
     91     main()
     92