blob: d4c0ef9b6de14686a19483be0e863d8b6a307136 [file] [log] [blame]
Guido van Rossum260cc1a81992-08-10 10:48:14 +00001# Display digits of pi in a window, calculating in a separate thread.
2# Compare ../scripts/pi.py.
3
Guido van Rossum655f6001994-05-16 09:34:05 +00004import sys
Guido van Rossum260cc1a81992-08-10 10:48:14 +00005import time
6import thread
7import stdwin
8from stdwinevents import *
9
Guido van Rossum655f6001994-05-16 09:34:05 +000010ok = 1
11
Guido van Rossum260cc1a81992-08-10 10:48:14 +000012digits = []
13
14def worker():
15 k, a, b, a1, b1 = 2l, 4l, 1l, 12l, 4l
Guido van Rossum655f6001994-05-16 09:34:05 +000016 while ok:
Guido van Rossum260cc1a81992-08-10 10:48:14 +000017 # Next approximation
18 p, q, k = k*k, 2l*k+1l, k+1l
19 a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
20 # Print common digits
21 d, d1 = a/b, a1/b1
22 #print a, b, a1, b1
23 while d == d1:
24 digits.append(`int(d)`)
25 a, a1 = 10l*(a%b), 10l*(a1%b1)
26 d, d1 = a/b, a1/b1
27
28def main():
Guido van Rossum655f6001994-05-16 09:34:05 +000029 global ok
Guido van Rossum260cc1a81992-08-10 10:48:14 +000030 digits_seen = 0
31 thread.start_new_thread(worker, ())
32 tw = stdwin.textwidth('0 ')
33 lh = stdwin.lineheight()
34 stdwin.setdefwinsize(20 * tw, 20 * lh)
Guido van Rossum655f6001994-05-16 09:34:05 +000035 stdwin.setdefscrollbars(0, 1)
Guido van Rossum260cc1a81992-08-10 10:48:14 +000036 win = stdwin.open('digits of pi')
37 options = win.menucreate('Options')
38 options.additem('Auto scroll')
39 autoscroll = 1
40 options.check(0, autoscroll)
41 while 1:
42 win.settimer(1)
43 type, w, detail = stdwin.getevent()
44 if type == WE_CLOSE:
Guido van Rossum655f6001994-05-16 09:34:05 +000045 ok = 0
46 sys.exit(0)
Guido van Rossum260cc1a81992-08-10 10:48:14 +000047 elif type == WE_DRAW:
48 (left, top), (right, bottom) = detail
49 digits_seen = len(digits)
50 d = win.begindrawing()
51 for i in range(digits_seen):
52 h = (i % 20) * tw
53 v = (i / 20) * lh
54 if top-lh < v < bottom:
55 d.text((h, v), digits[i])
56 d.close()
57 elif type == WE_TIMER:
58 n = len(digits)
59 if n > digits_seen:
60 win.settitle(`n` + ' digits of pi')
61 d = win.begindrawing()
62 for i in range(digits_seen, n):
63 h = (i % 20) * tw
64 v = (i / 20) * lh
65 d.text((h, v), digits[i])
66 d.close()
67 digits_seen = n
68 height = (v + 20*lh) / (20*lh) * (20*lh)
69 win.setdocsize(0, height)
70 if autoscroll:
71 win.show((0, v), (h+tw, v+lh))
72 elif type == WE_MENU:
73 menu, item = detail
74 if menu == options:
75 if item == 0:
76 autoscroll = (not autoscroll)
77 options.check(0, autoscroll)
78
79
80main()