blob: fdc558f88565ed015f67abb1ec3b04eb8cd5e77b [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossum4450bab1994-10-11 14:57:03 +00002
Tim Peters182b5ac2004-07-18 06:16:08 +00003# Simulate "electrons" migrating across the screen.
Guido van Rossum50df3811994-06-28 13:52:31 +00004# An optional bitmap file in can be in the background.
5#
6# Usage: electrons [n [bitmapfile]]
7#
Guido van Rossumf638d1c1998-05-26 21:43:44 +00008# n is the number of electrons to animate; default is 30.
Guido van Rossum50df3811994-06-28 13:52:31 +00009#
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
Guido van Rossum50df3811994-06-28 13:52:31 +000014from Tkinter import *
Guido van Rossumf638d1c1998-05-26 21:43:44 +000015import random
Guido van Rossum50df3811994-06-28 13:52:31 +000016
17
Guido van Rossum50df3811994-06-28 13:52:31 +000018# The graphical interface
19class Electrons:
20
Tim Peters182b5ac2004-07-18 06:16:08 +000021 # 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'])
Guido van Rossum50df3811994-06-28 13:52:31 +000028
Tim Peters182b5ac2004-07-18 06:16:08 +000029 # Add background bitmap
30 if bitmap:
31 self.bitmap = c.create_bitmap(width/2, height/2,
32 bitmap=bitmap,
33 foreground='blue')
Guido van Rossum50df3811994-06-28 13:52:31 +000034
Tim Peters182b5ac2004-07-18 06:16:08 +000035 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()
Guido van Rossum50df3811994-06-28 13:52:31 +000042
Tim Peters182b5ac2004-07-18 06:16:08 +000043 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()
Guido van Rossum89cb67b1996-07-30 18:57:18 +000050
Tim Peters182b5ac2004-07-18 06:16:08 +000051 # 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
Guido van Rossum89cb67b1996-07-30 18:57:18 +000061
Guido van Rossum50df3811994-06-28 13:52:31 +000062
63# Main program
64def main():
Tim Peters182b5ac2004-07-18 06:16:08 +000065 import sys, string
Guido van Rossum50df3811994-06-28 13:52:31 +000066
Tim Peters182b5ac2004-07-18 06:16:08 +000067 # 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
Guido van Rossum50df3811994-06-28 13:52:31 +000072
Tim Peters182b5ac2004-07-18 06:16:08 +000073 # 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
Guido van Rossum50df3811994-06-28 13:52:31 +000081
Tim Peters182b5ac2004-07-18 06:16:08 +000082 # Create the graphical objects...
83 h = Electrons(n, bitmap)
Guido van Rossum50df3811994-06-28 13:52:31 +000084
Tim Peters182b5ac2004-07-18 06:16:08 +000085 # ...and run!
86 h.run()
Guido van Rossum50df3811994-06-28 13:52:31 +000087
88
89# Call main when run as script
90if __name__ == '__main__':
Tim Peters182b5ac2004-07-18 06:16:08 +000091 main()