home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-16 | 1.8 KB | 81 lines | [TEXT/R*ch] |
- # Display digits of pi in a window, calculating in a separate thread.
- # Compare ../scripts/pi.py.
-
- import sys
- import time
- import thread
- import stdwin
- from stdwinevents import *
-
- ok = 1
-
- digits = []
-
- def worker():
- k, a, b, a1, b1 = 2l, 4l, 1l, 12l, 4l
- while ok:
- # Next approximation
- p, q, k = k*k, 2l*k+1l, k+1l
- a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
- # Print common digits
- d, d1 = a/b, a1/b1
- #print a, b, a1, b1
- while d == d1:
- digits.append(`int(d)`)
- a, a1 = 10l*(a%b), 10l*(a1%b1)
- d, d1 = a/b, a1/b1
-
- def main():
- global ok
- digits_seen = 0
- thread.start_new_thread(worker, ())
- tw = stdwin.textwidth('0 ')
- lh = stdwin.lineheight()
- stdwin.setdefwinsize(20 * tw, 20 * lh)
- stdwin.setdefscrollbars(0, 1)
- win = stdwin.open('digits of pi')
- options = win.menucreate('Options')
- options.additem('Auto scroll')
- autoscroll = 1
- options.check(0, autoscroll)
- while 1:
- win.settimer(1)
- type, w, detail = stdwin.getevent()
- if type == WE_CLOSE:
- ok = 0
- sys.exit(0)
- elif type == WE_DRAW:
- (left, top), (right, bottom) = detail
- digits_seen = len(digits)
- d = win.begindrawing()
- for i in range(digits_seen):
- h = (i % 20) * tw
- v = (i / 20) * lh
- if top-lh < v < bottom:
- d.text((h, v), digits[i])
- d.close()
- elif type == WE_TIMER:
- n = len(digits)
- if n > digits_seen:
- win.settitle(`n` + ' digits of pi')
- d = win.begindrawing()
- for i in range(digits_seen, n):
- h = (i % 20) * tw
- v = (i / 20) * lh
- d.text((h, v), digits[i])
- d.close()
- digits_seen = n
- height = (v + 20*lh) / (20*lh) * (20*lh)
- win.setdocsize(0, height)
- if autoscroll:
- win.show((0, v), (h+tw, v+lh))
- elif type == WE_MENU:
- menu, item = detail
- if menu == options:
- if item == 0:
- autoscroll = (not autoscroll)
- options.check(0, autoscroll)
-
-
- main()
-