[Python-checkins] cpython (2.7): Issue #21882: In turtle demos, remove module scope gui and sys calls by

terry.reedy python-checkins at python.org
Mon Jun 30 22:10:15 CEST 2014


http://hg.python.org/cpython/rev/c173a34f20c0
changeset:   91487:c173a34f20c0
branch:      2.7
parent:      91477:53112afddae6
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Mon Jun 30 16:09:16 2014 -0400
summary:
  Issue #21882: In turtle demos, remove module scope gui and sys calls by
moving them to the module's main function.

files:
  Demo/turtle/demohelp.txt               |   3 +
  Demo/turtle/tdemo_clock.py             |   8 +-
  Demo/turtle/tdemo_minimal_hanoi.py     |   1 -
  Demo/turtle/tdemo_nim.py               |  27 +++---
  Demo/turtle/tdemo_two_canvases.py      |  54 ++++++++++++++
  Demo/turtle/turtledemo_two_canvases.py |  49 ------------
  Lib/lib-tk/turtle.py                   |   2 +-
  7 files changed, 73 insertions(+), 71 deletions(-)


diff --git a/Demo/turtle/demohelp.txt b/Demo/turtle/demohelp.txt
--- a/Demo/turtle/demohelp.txt
+++ b/Demo/turtle/demohelp.txt
@@ -52,6 +52,9 @@
 
 
    (2) How to add your own demos to the demo repository
+     IMPORTANT! When imported, the demo should not modify the system
+     by calling functions in other modules, such as sys, tkinter, or
+     turtle. Global variables should be initialized in main().
 
    - The script name must begin with tdemo_ ,
      so it must have the form tdemo_<your-script-name>.py
diff --git a/Demo/turtle/tdemo_clock.py b/Demo/turtle/tdemo_clock.py
--- a/Demo/turtle/tdemo_clock.py
+++ b/Demo/turtle/tdemo_clock.py
@@ -11,11 +11,8 @@
   ------------------------------------
 """
 from turtle import *
-from turtle import Terminator  # not in __all__
 from datetime import datetime
 
-mode("logo")
-
 def jump(distanz, winkel=0):
     penup()
     right(winkel)
@@ -43,7 +40,6 @@
     hand_form = get_poly()
     register_shape(name, hand_form)
 
-
 def clockface(radius):
     reset()
     pensize(7)
@@ -84,7 +80,6 @@
     writer.pu()
     writer.bk(85)
 
-
 def wochentag(t):
     wochentag = ["Monday", "Tuesday", "Wednesday",
         "Thursday", "Friday", "Saturday", "Sunday"]
@@ -131,6 +126,7 @@
     return "EVENTLOOP"
 
 if __name__ == "__main__":
+    mode("logo")
     msg = main()
     print msg
-    mainloop()
+    mainloop()  # keep window open
diff --git a/Demo/turtle/tdemo_minimal_hanoi.py b/Demo/turtle/tdemo_minimal_hanoi.py
--- a/Demo/turtle/tdemo_minimal_hanoi.py
+++ b/Demo/turtle/tdemo_minimal_hanoi.py
@@ -18,7 +18,6 @@
  ---------------------------------------
 """
 from turtle import *
-from turtle import Terminator  # not in __all__
 
 class Disc(Turtle):
     def __init__(self, n):
diff --git a/Demo/turtle/tdemo_nim.py b/Demo/turtle/tdemo_nim.py
--- a/Demo/turtle/tdemo_nim.py
+++ b/Demo/turtle/tdemo_nim.py
@@ -1,7 +1,7 @@
 """      turtle-example-suite:
 
             tdemo_nim.py
-         
+
 Play nim against the computer. The player
 who takes the last stick is the winner.
 
@@ -41,7 +41,7 @@
             return move
 
 def randommove(state):
-    m = max(state)   
+    m = max(state)
     while True:
         z = random.randint(0,2)
         if state[z] > (m > 1):
@@ -62,7 +62,7 @@
         self.winner = None
         self.game.view.setup()
         self.game.state = Nim.RUNNING
-        
+
     def move(self, row, col):
         maxspalte = self.sticks[row]
         self.sticks[row] = col
@@ -76,7 +76,7 @@
             row, col = computerzug(self.sticks)
             self.move(row, col)
             self.player = 0
-        
+
     def game_over(self):
         return self.sticks == [0, 0, 0]
 
@@ -100,13 +100,13 @@
         self.goto(x,y)
         self.color("white")
         self.showturtle()
-            
+
     def coords(self, row, col):
         packet, remainder = divmod(col, 5)
         x = (3 + 11 * packet + 2 * remainder) * WUNIT
         y = (2 + 3 * row) * HUNIT
         return x - SCREENWIDTH // 2 + WUNIT // 2, SCREENHEIGHT // 2 - y - HUNIT // 2
-        
+
     def makemove(self, x, y):
         if self.game.state != Nim.RUNNING:
             return
@@ -142,7 +142,7 @@
         self.writer.pencolor("black")
         self.writer.write(msg1, align="center", font=("Courier",14,"bold"))
         self.screen.tracer(True)
-        
+
 
     def setup(self):
         self.screen.tracer(False)
@@ -181,6 +181,7 @@
         if self.game.state == Nim.OVER:
             self.screen.clear()
 
+
 class NimController(object):
 
     def __init__(self, game):
@@ -200,28 +201,26 @@
         self.BUSY = True
         self.game.model.notify_move(row, col)
         self.BUSY = False
-                
+
 class Nim(object):
     CREATED = 0
     RUNNING = 1
     OVER = 2
     def __init__(self, screen):
-        self.state = Nim.CREATED 
+        self.state = Nim.CREATED
         self.screen = screen
         self.model = NimModel(self)
         self.view = NimView(self)
         self.controller = NimController(self)
-        
 
-mainscreen = turtle.Screen()
-mainscreen.mode("standard")
-mainscreen.setup(SCREENWIDTH, SCREENHEIGHT)
 
 def main():
+    mainscreen = turtle.Screen()
+    mainscreen.mode("standard")
+    mainscreen.setup(SCREENWIDTH, SCREENHEIGHT)
     nim = Nim(mainscreen)
     return "EVENTLOOP!"
 
 if __name__ == "__main__":
     main()
     turtle.mainloop()
-    
diff --git a/Demo/turtle/tdemo_two_canvases.py b/Demo/turtle/tdemo_two_canvases.py
new file mode 100644
--- /dev/null
+++ b/Demo/turtle/tdemo_two_canvases.py
@@ -0,0 +1,54 @@
+"""turtledemo.two_canvases
+
+Use TurtleScreen and RawTurtle to draw on two
+distinct canvases in a separate windows. The
+new window must be separately closed in
+addition to pressing the STOP button.
+"""
+
+from turtle import TurtleScreen, RawTurtle, TK
+
+def main():
+    root = TK.Tk()
+    cv1 = TK.Canvas(root, width=300, height=200, bg="#ddffff")
+    cv2 = TK.Canvas(root, width=300, height=200, bg="#ffeeee")
+    cv1.pack()
+    cv2.pack()
+
+    s1 = TurtleScreen(cv1)
+    s1.bgcolor(0.85, 0.85, 1)
+    s2 = TurtleScreen(cv2)
+    s2.bgcolor(1, 0.85, 0.85)
+
+    p = RawTurtle(s1)
+    q = RawTurtle(s2)
+
+    p.color("red", (1, 0.85, 0.85))
+    p.width(3)
+    q.color("blue", (0.85, 0.85, 1))
+    q.width(3)
+
+    for t in p,q:
+        t.shape("turtle")
+        t.lt(36)
+
+    q.lt(180)
+
+    for t in p, q:
+        t.begin_fill()
+    for i in range(5):
+        for t in p, q:
+            t.fd(50)
+            t.lt(72)
+    for t in p,q:
+        t.end_fill()
+        t.lt(54)
+        t.pu()
+        t.bk(50)
+
+    return "EVENTLOOP"
+
+
+if __name__ == '__main__':
+    main()
+    TK.mainloop()  # keep window open until user closes it
diff --git a/Demo/turtle/turtledemo_two_canvases.py b/Demo/turtle/turtledemo_two_canvases.py
deleted file mode 100755
--- a/Demo/turtle/turtledemo_two_canvases.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-## DEMONSTRATES USE OF 2 CANVASES, SO CANNOT BE RUN IN DEMOVIEWER!
-"""turtle example: Using TurtleScreen and RawTurtle
-for drawing on two distinct canvases.
-"""
-from turtle import TurtleScreen, RawTurtle, TK
-
-root = TK.Tk()
-cv1 = TK.Canvas(root, width=300, height=200, bg="#ddffff")
-cv2 = TK.Canvas(root, width=300, height=200, bg="#ffeeee")
-cv1.pack()
-cv2.pack()
-
-s1 = TurtleScreen(cv1)
-s1.bgcolor(0.85, 0.85, 1)
-s2 = TurtleScreen(cv2)
-s2.bgcolor(1, 0.85, 0.85)
-
-p = RawTurtle(s1)
-q = RawTurtle(s2)
-
-p.color("red", "white")
-p.width(3)
-q.color("blue", "black")
-q.width(3)
-
-for t in p,q:
-    t.shape("turtle")
-    t.lt(36)
-
-q.lt(180)
-
-for i in range(5):
-    for t in p, q:
-        t.fd(50)
-        t.lt(72)
-for t in p,q:
-    t.lt(54)
-    t.pu()
-    t.bk(50)
-
-## Want to get some info?
-
-print s1, s2
-print p, q
-print s1.turtles()
-print s2.turtles()
-
-TK.mainloop()
diff --git a/Lib/lib-tk/turtle.py b/Lib/lib-tk/turtle.py
--- a/Lib/lib-tk/turtle.py
+++ b/Lib/lib-tk/turtle.py
@@ -142,7 +142,7 @@
         'log10', 'modf', 'pi', 'pow', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
 
 __all__ = (_tg_classes + _tg_screen_functions + _tg_turtle_functions +
-           _tg_utilities + _math_functions)
+           _tg_utilities + ['Terminator'] + _math_functions)
 
 _alias_list = ['addshape', 'backward', 'bk', 'fd', 'ht', 'lt', 'pd', 'pos',
                'pu', 'rt', 'seth', 'setpos', 'setposition', 'st',

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list