From f5ac57dc05818e4fe2ff5118680fe136937d768e Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 30 Jun 2014 16:09:24 -0400 Subject: [PATCH] Issue #21882: In turtle demos, remove module scope gui and sys calls by either deleting or moving to the module's main function. --- Lib/turtle.py | 2 +- Lib/turtledemo/clock.py | 6 +-- Lib/turtledemo/colormixer.py | 2 - Lib/turtledemo/demohelp.txt | 5 ++- Lib/turtledemo/minimal_hanoi.py | 1 - Lib/turtledemo/nim.py | 10 ++--- Lib/turtledemo/two_canvases.py | 80 +++++++++++++++------------------ 7 files changed, 48 insertions(+), 58 deletions(-) diff --git a/Lib/turtle.py b/Lib/turtle.py index 3d1d3b060d3..465d6e065d1 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -140,7 +140,7 @@ _tg_turtle_functions = ['back', 'backward', 'begin_fill', 'begin_poly', 'bk', _tg_utilities = ['write_docstringdict', 'done'] __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', diff --git a/Lib/turtledemo/clock.py b/Lib/turtledemo/clock.py index b7a2f36646c..62c8851606b 100755 --- a/Lib/turtledemo/clock.py +++ b/Lib/turtledemo/clock.py @@ -11,11 +11,8 @@ and time ------------------------------------ """ 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 @@ def make_hand_shape(name, laenge, spitze): hand_form = get_poly() register_shape(name, hand_form) - def clockface(radius): reset() pensize(7) @@ -84,7 +80,6 @@ def setup(): writer.pu() writer.bk(85) - def wochentag(t): wochentag = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] @@ -131,6 +126,7 @@ def main(): return "EVENTLOOP" if __name__ == "__main__": + mode("logo") msg = main() print(msg) mainloop() diff --git a/Lib/turtledemo/colormixer.py b/Lib/turtledemo/colormixer.py index f5d308d4430..448db83361a 100644 --- a/Lib/turtledemo/colormixer.py +++ b/Lib/turtledemo/colormixer.py @@ -1,8 +1,6 @@ # colormixer from turtle import Screen, Turtle, mainloop -import sys -sys.setrecursionlimit(20000) # overcomes, for now, an instability of Python 3.0 class ColorTurtle(Turtle): diff --git a/Lib/turtledemo/demohelp.txt b/Lib/turtledemo/demohelp.txt index 5a7f557e7e4..11842e10d34 100644 --- a/Lib/turtledemo/demohelp.txt +++ b/Lib/turtledemo/demohelp.txt @@ -54,6 +54,9 @@ (2) How to add your own demos to the demo repository - Place the file in the same directory as turtledemo/__main__.py + 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 code must contain a main() function which will be executed by the viewer (see provided example scripts). @@ -65,7 +68,7 @@ if __name__ == '__main__': main() - mainloop() # keep window + mainloop() # keep window open python -m turtledemo.mydemo # will then run it diff --git a/Lib/turtledemo/minimal_hanoi.py b/Lib/turtledemo/minimal_hanoi.py index 5e9c27b5367..4a432f2b290 100755 --- a/Lib/turtledemo/minimal_hanoi.py +++ b/Lib/turtledemo/minimal_hanoi.py @@ -18,7 +18,6 @@ stretched to rectangles by shapesize() --------------------------------------- """ from turtle import * -from turtle import Terminator # not in __all__ class Disc(Turtle): def __init__(self, n): diff --git a/Lib/turtledemo/nim.py b/Lib/turtledemo/nim.py index 792ba515348..25ff3128f6c 100644 --- a/Lib/turtledemo/nim.py +++ b/Lib/turtledemo/nim.py @@ -143,7 +143,6 @@ class NimView(object): self.writer.write(msg1, align="center", font=("Courier",14,"bold")) self.screen.tracer(True) - def setup(self): self.screen.tracer(False) for row in range(3): @@ -181,6 +180,7 @@ class NimView(object): if self.game.state == Nim.OVER: self.screen.clear() + class NimController(object): def __init__(self, game): @@ -201,6 +201,7 @@ class NimController(object): self.game.model.notify_move(row, col) self.BUSY = False + class Nim(object): CREATED = 0 RUNNING = 1 @@ -213,11 +214,10 @@ class Nim(object): 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!" diff --git a/Lib/turtledemo/two_canvases.py b/Lib/turtledemo/two_canvases.py index 26882caccf7..d579876616f 100755 --- a/Lib/turtledemo/two_canvases.py +++ b/Lib/turtledemo/two_canvases.py @@ -1,60 +1,54 @@ """turtledemo.two_canvases Use TurtleScreen and RawTurtle to draw on two -distinct canvases. +distinct canvases in a separate windows. The +new window must be separately closed in +addition to pressing the STOP button. """ -#The final mainloop only serves to keep the window open. - -#TODO: This runs in its own two-canvas window when selected in the -#demoviewer examples menu but the text is not loaded and the previous -#example is left visible. If the ending mainloop is removed, the text -#Eis loaded, this run again in a third window, and if start is pressed, -#demoviewer raises an error because main is not found, and then freezes. 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() +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) + 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 = 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) + 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) + for t in p,q: + t.shape("turtle") + t.lt(36) -q.lt(180) + 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) + 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) -## Want to get some info? + return "EVENTLOOP" -#print(s1, s2) -#print(p, q) -#print(s1.turtles()) -#print(s2.turtles()) -TK.mainloop() +if __name__ == '__main__': + main() + TK.mainloop() # keep window open until user closes it