|
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() |