electrons.py 2.27 KB
Newer Older
1
#! /usr/bin/env python
Guido van Rossum's avatar
Guido van Rossum committed
2

3
# Simulate "electrons" migrating across the screen.
Guido van Rossum's avatar
Guido van Rossum committed
4 5 6 7
# An optional bitmap file in can be in the background.
#
# Usage: electrons [n [bitmapfile]]
#
8
# n is the number of electrons to animate; default is 30.
Guido van Rossum's avatar
Guido van Rossum committed
9 10 11 12 13
#
# 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.

14
from tkinter import *
15
import random
Guido van Rossum's avatar
Guido van Rossum committed
16 17 18 19 20


# The graphical interface
class Electrons:

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
    # 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
Guido van Rossum's avatar
Guido van Rossum committed
61

Guido van Rossum's avatar
Guido van Rossum committed
62 63 64

# Main program
def main():
65
    import sys, string
Guido van Rossum's avatar
Guido van Rossum committed
66

67 68 69 70 71
    # First argument is number of electrons, default 30
    if sys.argv[1:]:
        n = string.atoi(sys.argv[1])
    else:
        n = 30
Guido van Rossum's avatar
Guido van Rossum committed
72

73 74 75 76 77 78 79 80
    # 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
Guido van Rossum's avatar
Guido van Rossum committed
81

82 83
    # Create the graphical objects...
    h = Electrons(n, bitmap)
Guido van Rossum's avatar
Guido van Rossum committed
84

85 86
    # ...and run!
    h.run()
Guido van Rossum's avatar
Guido van Rossum committed
87 88 89 90


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