[Feature][YUKUAI_patch]add 18.02 code
Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No
Change-Id: I7f71153004f10fc0ea5adfa083866aaeeb1053ac
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__init__.py b/rootfs/usr/lib/python3.8/turtledemo/__init__.py
new file mode 100644
index 0000000..77150e2
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__init__.py
@@ -0,0 +1,14 @@
+"""
+ --------------------------------------
+ About this viewer
+ --------------------------------------
+
+ Tiny demo viewer to view turtle graphics example scripts.
+
+ Quickly and dirtyly assembled by Gregor Lingl.
+ June, 2006
+
+ For more information see: turtledemo - Help
+
+ Have fun!
+"""
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__main__.py b/rootfs/usr/lib/python3.8/turtledemo/__main__.py
new file mode 100644
index 0000000..12be509
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__main__.py
@@ -0,0 +1,386 @@
+#!/usr/bin/env python3
+
+"""
+ ----------------------------------------------
+ turtleDemo - Help
+ ----------------------------------------------
+
+ This document has two sections:
+
+ (1) How to use the demo viewer
+ (2) How to add your own demos to the demo repository
+
+
+ (1) How to use the demo viewer.
+
+ Select a demoscript from the example menu.
+ The (syntax colored) source code appears in the left
+ source code window. IT CANNOT BE EDITED, but ONLY VIEWED!
+
+ The demo viewer windows can be resized. The divider between text
+ and canvas can be moved by grabbing it with the mouse. The text font
+ size can be changed from the menu and with Control/Command '-'/'+'.
+ It can also be changed on most systems with Control-mousewheel
+ when the mouse is over the text.
+
+ Press START button to start the demo.
+ Stop execution by pressing the STOP button.
+ Clear screen by pressing the CLEAR button.
+ Restart by pressing the START button again.
+
+ SPECIAL demos, such as clock.py are those which run EVENTDRIVEN.
+
+ Press START button to start the demo.
+
+ - Until the EVENTLOOP is entered everything works
+ as in an ordinary demo script.
+
+ - When the EVENTLOOP is entered, you control the
+ application by using the mouse and/or keys (or it's
+ controlled by some timer events)
+ To stop it you can and must press the STOP button.
+
+ While the EVENTLOOP is running, the examples menu is disabled.
+
+ - Only after having pressed the STOP button, you may
+ restart it or choose another example script.
+
+ * * * * * * * *
+ In some rare situations there may occur interferences/conflicts
+ between events concerning the demo script and those concerning the
+ demo-viewer. (They run in the same process.) Strange behaviour may be
+ the consequence and in the worst case you must close and restart the
+ viewer.
+ * * * * * * * *
+
+
+ (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).
+ It may return a string which will be displayed in the Label below
+ the source code window (when execution has finished.)
+
+ - In order to run mydemo.py by itself, such as during development,
+ add the following at the end of the file:
+
+ if __name__ == '__main__':
+ main()
+ mainloop() # keep window open
+
+ python -m turtledemo.mydemo # will then run it
+
+ - If the demo is EVENT DRIVEN, main must return the string
+ "EVENTLOOP". This informs the demo viewer that the script is
+ still running and must be stopped by the user!
+
+ If an "EVENTLOOP" demo runs by itself, as with clock, which uses
+ ontimer, or minimal_hanoi, which loops by recursion, then the
+ code should catch the turtle.Terminator exception that will be
+ raised when the user presses the STOP button. (Paint is not such
+ a demo; it only acts in response to mouse clicks and movements.)
+"""
+import sys
+import os
+
+from tkinter import *
+from idlelib.colorizer import ColorDelegator, color_config
+from idlelib.percolator import Percolator
+from idlelib.textview import view_text
+from turtledemo import __doc__ as about_turtledemo
+
+import turtle
+
+demo_dir = os.path.dirname(os.path.abspath(__file__))
+darwin = sys.platform == 'darwin'
+
+STARTUP = 1
+READY = 2
+RUNNING = 3
+DONE = 4
+EVENTDRIVEN = 5
+
+menufont = ("Arial", 12, NORMAL)
+btnfont = ("Arial", 12, 'bold')
+txtfont = ['Lucida Console', 10, 'normal']
+
+MINIMUM_FONT_SIZE = 6
+MAXIMUM_FONT_SIZE = 100
+font_sizes = [8, 9, 10, 11, 12, 14, 18, 20, 22, 24, 30]
+
+def getExampleEntries():
+ return [entry[:-3] for entry in os.listdir(demo_dir) if
+ entry.endswith(".py") and entry[0] != '_']
+
+help_entries = ( # (help_label, help_doc)
+ ('Turtledemo help', __doc__),
+ ('About turtledemo', about_turtledemo),
+ ('About turtle module', turtle.__doc__),
+ )
+
+
+
+class DemoWindow(object):
+
+ def __init__(self, filename=None):
+ self.root = root = turtle._root = Tk()
+ root.title('Python turtle-graphics examples')
+ root.wm_protocol("WM_DELETE_WINDOW", self._destroy)
+
+ if darwin:
+ import subprocess
+ # Make sure we are the currently activated OS X application
+ # so that our menu bar appears.
+ subprocess.run(
+ [
+ 'osascript',
+ '-e', 'tell application "System Events"',
+ '-e', 'set frontmost of the first process whose '
+ 'unix id is {} to true'.format(os.getpid()),
+ '-e', 'end tell',
+ ],
+ stderr=subprocess.DEVNULL,
+ stdout=subprocess.DEVNULL,)
+
+ root.grid_rowconfigure(0, weight=1)
+ root.grid_columnconfigure(0, weight=1)
+ root.grid_columnconfigure(1, minsize=90, weight=1)
+ root.grid_columnconfigure(2, minsize=90, weight=1)
+ root.grid_columnconfigure(3, minsize=90, weight=1)
+
+ self.mBar = Menu(root, relief=RAISED, borderwidth=2)
+ self.mBar.add_cascade(menu=self.makeLoadDemoMenu(self.mBar),
+ label='Examples', underline=0)
+ self.mBar.add_cascade(menu=self.makeFontMenu(self.mBar),
+ label='Fontsize', underline=0)
+ self.mBar.add_cascade(menu=self.makeHelpMenu(self.mBar),
+ label='Help', underline=0)
+ root['menu'] = self.mBar
+
+ pane = PanedWindow(orient=HORIZONTAL, sashwidth=5,
+ sashrelief=SOLID, bg='#ddd')
+ pane.add(self.makeTextFrame(pane))
+ pane.add(self.makeGraphFrame(pane))
+ pane.grid(row=0, columnspan=4, sticky='news')
+
+ self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf",
+ font=("Arial", 16, 'normal'), borderwidth=2,
+ relief=RIDGE)
+ self.start_btn = Button(root, text=" START ", font=btnfont,
+ fg="white", disabledforeground = "#fed",
+ command=self.startDemo)
+ self.stop_btn = Button(root, text=" STOP ", font=btnfont,
+ fg="white", disabledforeground = "#fed",
+ command=self.stopIt)
+ self.clear_btn = Button(root, text=" CLEAR ", font=btnfont,
+ fg="white", disabledforeground="#fed",
+ command = self.clearCanvas)
+ self.output_lbl.grid(row=1, column=0, sticky='news', padx=(0,5))
+ self.start_btn.grid(row=1, column=1, sticky='ew')
+ self.stop_btn.grid(row=1, column=2, sticky='ew')
+ self.clear_btn.grid(row=1, column=3, sticky='ew')
+
+ Percolator(self.text).insertfilter(ColorDelegator())
+ self.dirty = False
+ self.exitflag = False
+ if filename:
+ self.loadfile(filename)
+ self.configGUI(DISABLED, DISABLED, DISABLED,
+ "Choose example from menu", "black")
+ self.state = STARTUP
+
+
+ def onResize(self, event):
+ cwidth = self._canvas.winfo_width()
+ cheight = self._canvas.winfo_height()
+ self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth)
+ self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight)
+
+ def makeTextFrame(self, root):
+ self.text_frame = text_frame = Frame(root)
+ self.text = text = Text(text_frame, name='text', padx=5,
+ wrap='none', width=45)
+ color_config(text)
+
+ self.vbar = vbar = Scrollbar(text_frame, name='vbar')
+ vbar['command'] = text.yview
+ vbar.pack(side=LEFT, fill=Y)
+ self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL)
+ hbar['command'] = text.xview
+ hbar.pack(side=BOTTOM, fill=X)
+ text['yscrollcommand'] = vbar.set
+ text['xscrollcommand'] = hbar.set
+
+ text['font'] = tuple(txtfont)
+ shortcut = 'Command' if darwin else 'Control'
+ text.bind_all('<%s-minus>' % shortcut, self.decrease_size)
+ text.bind_all('<%s-underscore>' % shortcut, self.decrease_size)
+ text.bind_all('<%s-equal>' % shortcut, self.increase_size)
+ text.bind_all('<%s-plus>' % shortcut, self.increase_size)
+ text.bind('<Control-MouseWheel>', self.update_mousewheel)
+ text.bind('<Control-Button-4>', self.increase_size)
+ text.bind('<Control-Button-5>', self.decrease_size)
+
+ text.pack(side=LEFT, fill=BOTH, expand=1)
+ return text_frame
+
+ def makeGraphFrame(self, root):
+ turtle._Screen._root = root
+ self.canvwidth = 1000
+ self.canvheight = 800
+ turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas(
+ root, 800, 600, self.canvwidth, self.canvheight)
+ canvas.adjustScrolls()
+ canvas._rootwindow.bind('<Configure>', self.onResize)
+ canvas._canvas['borderwidth'] = 0
+
+ self.screen = _s_ = turtle.Screen()
+ turtle.TurtleScreen.__init__(_s_, _s_._canvas)
+ self.scanvas = _s_._canvas
+ turtle.RawTurtle.screens = [_s_]
+ return canvas
+
+ def set_txtsize(self, size):
+ txtfont[1] = size
+ self.text['font'] = tuple(txtfont)
+ self.output_lbl['text'] = 'Font size %d' % size
+
+ def decrease_size(self, dummy=None):
+ self.set_txtsize(max(txtfont[1] - 1, MINIMUM_FONT_SIZE))
+ return 'break'
+
+ def increase_size(self, dummy=None):
+ self.set_txtsize(min(txtfont[1] + 1, MAXIMUM_FONT_SIZE))
+ return 'break'
+
+ def update_mousewheel(self, event):
+ # For wheel up, event.delta = 120 on Windows, -1 on darwin.
+ # X-11 sends Control-Button-4 event instead.
+ if (event.delta < 0) == (not darwin):
+ return self.decrease_size()
+ else:
+ return self.increase_size()
+
+ def configGUI(self, start, stop, clear, txt="", color="blue"):
+ self.start_btn.config(state=start,
+ bg="#d00" if start == NORMAL else "#fca")
+ self.stop_btn.config(state=stop,
+ bg="#d00" if stop == NORMAL else "#fca")
+ self.clear_btn.config(state=clear,
+ bg="#d00" if clear == NORMAL else "#fca")
+ self.output_lbl.config(text=txt, fg=color)
+
+ def makeLoadDemoMenu(self, master):
+ menu = Menu(master)
+
+ for entry in getExampleEntries():
+ def load(entry=entry):
+ self.loadfile(entry)
+ menu.add_command(label=entry, underline=0,
+ font=menufont, command=load)
+ return menu
+
+ def makeFontMenu(self, master):
+ menu = Menu(master)
+ menu.add_command(label="Decrease (C-'-')", command=self.decrease_size,
+ font=menufont)
+ menu.add_command(label="Increase (C-'+')", command=self.increase_size,
+ font=menufont)
+ menu.add_separator()
+
+ for size in font_sizes:
+ def resize(size=size):
+ self.set_txtsize(size)
+ menu.add_command(label=str(size), underline=0,
+ font=menufont, command=resize)
+ return menu
+
+ def makeHelpMenu(self, master):
+ menu = Menu(master)
+
+ for help_label, help_file in help_entries:
+ def show(help_label=help_label, help_file=help_file):
+ view_text(self.root, help_label, help_file)
+ menu.add_command(label=help_label, font=menufont, command=show)
+ return menu
+
+ def refreshCanvas(self):
+ if self.dirty:
+ self.screen.clear()
+ self.dirty=False
+
+ def loadfile(self, filename):
+ self.clearCanvas()
+ turtle.TurtleScreen._RUNNING = False
+ modname = 'turtledemo.' + filename
+ __import__(modname)
+ self.module = sys.modules[modname]
+ with open(self.module.__file__, 'r') as f:
+ chars = f.read()
+ self.text.delete("1.0", "end")
+ self.text.insert("1.0", chars)
+ self.root.title(filename + " - a Python turtle graphics example")
+ self.configGUI(NORMAL, DISABLED, DISABLED,
+ "Press start button", "red")
+ self.state = READY
+
+ def startDemo(self):
+ self.refreshCanvas()
+ self.dirty = True
+ turtle.TurtleScreen._RUNNING = True
+ self.configGUI(DISABLED, NORMAL, DISABLED,
+ "demo running...", "black")
+ self.screen.clear()
+ self.screen.mode("standard")
+ self.state = RUNNING
+
+ try:
+ result = self.module.main()
+ if result == "EVENTLOOP":
+ self.state = EVENTDRIVEN
+ else:
+ self.state = DONE
+ except turtle.Terminator:
+ if self.root is None:
+ return
+ self.state = DONE
+ result = "stopped!"
+ if self.state == DONE:
+ self.configGUI(NORMAL, DISABLED, NORMAL,
+ result)
+ elif self.state == EVENTDRIVEN:
+ self.exitflag = True
+ self.configGUI(DISABLED, NORMAL, DISABLED,
+ "use mouse/keys or STOP", "red")
+
+ def clearCanvas(self):
+ self.refreshCanvas()
+ self.screen._delete("all")
+ self.scanvas.config(cursor="")
+ self.configGUI(NORMAL, DISABLED, DISABLED)
+
+ def stopIt(self):
+ if self.exitflag:
+ self.clearCanvas()
+ self.exitflag = False
+ self.configGUI(NORMAL, DISABLED, DISABLED,
+ "STOPPED!", "red")
+ turtle.TurtleScreen._RUNNING = False
+
+ def _destroy(self):
+ turtle.TurtleScreen._RUNNING = False
+ self.root.destroy()
+ self.root = None
+
+
+def main():
+ demo = DemoWindow()
+ demo.root.mainloop()
+
+if __name__ == '__main__':
+ main()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..237e7f1
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..5d3f6de
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..237e7f1
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__init__.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..39cd79a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..7857af9
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.pyc
new file mode 100644
index 0000000..39cd79a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/__main__.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..28abb6d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..228c223
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.pyc
new file mode 100644
index 0000000..28abb6d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/bytedesign.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..c3e4576
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..c3e4576
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.pyc
new file mode 100644
index 0000000..c3e4576
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/chaos.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..6421f9e
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..f4ee2f8
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.pyc
new file mode 100644
index 0000000..6421f9e
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/clock.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..ff49664
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..ff49664
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.pyc
new file mode 100644
index 0000000..ff49664
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/colormixer.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..652ea32
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..78323a1
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.pyc
new file mode 100644
index 0000000..652ea32
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/forest.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..a0cdd9e
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..58ff7ac
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.pyc
new file mode 100644
index 0000000..a0cdd9e
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/fractalcurves.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..d6e3141
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..0c0d673
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.pyc
new file mode 100644
index 0000000..d6e3141
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/lindenmayer.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..eaa7a27
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..48e3518
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.pyc
new file mode 100644
index 0000000..eaa7a27
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/minimal_hanoi.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..b436f21
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..8890f41
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.pyc
new file mode 100644
index 0000000..b436f21
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/nim.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..ed8f681
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..489d05d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.pyc
new file mode 100644
index 0000000..ed8f681
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/paint.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..41c6168
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..b4afb18
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.pyc
new file mode 100644
index 0000000..41c6168
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/peace.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..191627a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..204d41d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.pyc
new file mode 100644
index 0000000..191627a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/penrose.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..1c888f9
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..1662927
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.pyc
new file mode 100644
index 0000000..1c888f9
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/planet_and_moon.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..160aa3c
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..8f1c25d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.pyc
new file mode 100644
index 0000000..160aa3c
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/rosette.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..2a12c22
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..5b3c208
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.pyc
new file mode 100644
index 0000000..2a12c22
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/round_dance.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..3625ef7
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..26f050e
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.pyc
new file mode 100644
index 0000000..3625ef7
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/sorting_animate.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..b65f95c
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..504435d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.pyc
new file mode 100644
index 0000000..b65f95c
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/tree.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..4e58984
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..8915b06
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.pyc
new file mode 100644
index 0000000..4e58984
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/two_canvases.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-1.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-1.pyc
new file mode 100644
index 0000000..f9c68ce
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-1.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-2.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-2.pyc
new file mode 100644
index 0000000..1a32c3a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.opt-2.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.pyc b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.pyc
new file mode 100644
index 0000000..f9c68ce
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/__pycache__/yinyang.cpython-38.pyc
Binary files differ
diff --git a/rootfs/usr/lib/python3.8/turtledemo/bytedesign.py b/rootfs/usr/lib/python3.8/turtledemo/bytedesign.py
new file mode 100755
index 0000000..1b7452b
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/bytedesign.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_bytedesign.py
+
+An example adapted from the example-suite
+of PythonCard's turtle graphics.
+
+It's based on an article in BYTE magazine
+Problem Solving with Logo: Using Turtle
+Graphics to Redraw a Design
+November 1982, p. 118 - 134
+
+-------------------------------------------
+
+Due to the statement
+
+t.delay(0)
+
+in line 152, which sets the animation delay
+to 0, this animation runs in "line per line"
+mode as fast as possible.
+"""
+
+from turtle import Turtle, mainloop
+from time import perf_counter as clock
+
+# wrapper for any additional drawing routines
+# that need to know about each other
+class Designer(Turtle):
+
+ def design(self, homePos, scale):
+ self.up()
+ for i in range(5):
+ self.forward(64.65 * scale)
+ self.down()
+ self.wheel(self.position(), scale)
+ self.up()
+ self.backward(64.65 * scale)
+ self.right(72)
+ self.up()
+ self.goto(homePos)
+ self.right(36)
+ self.forward(24.5 * scale)
+ self.right(198)
+ self.down()
+ self.centerpiece(46 * scale, 143.4, scale)
+ self.getscreen().tracer(True)
+
+ def wheel(self, initpos, scale):
+ self.right(54)
+ for i in range(4):
+ self.pentpiece(initpos, scale)
+ self.down()
+ self.left(36)
+ for i in range(5):
+ self.tripiece(initpos, scale)
+ self.left(36)
+ for i in range(5):
+ self.down()
+ self.right(72)
+ self.forward(28 * scale)
+ self.up()
+ self.backward(28 * scale)
+ self.left(54)
+ self.getscreen().update()
+
+ def tripiece(self, initpos, scale):
+ oldh = self.heading()
+ self.down()
+ self.backward(2.5 * scale)
+ self.tripolyr(31.5 * scale, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.down()
+ self.backward(2.5 * scale)
+ self.tripolyl(31.5 * scale, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.left(72)
+ self.getscreen().update()
+
+ def pentpiece(self, initpos, scale):
+ oldh = self.heading()
+ self.up()
+ self.forward(29 * scale)
+ self.down()
+ for i in range(5):
+ self.forward(18 * scale)
+ self.right(72)
+ self.pentr(18 * scale, 75, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.forward(29 * scale)
+ self.down()
+ for i in range(5):
+ self.forward(18 * scale)
+ self.right(72)
+ self.pentl(18 * scale, 75, scale)
+ self.up()
+ self.goto(initpos)
+ self.setheading(oldh)
+ self.left(72)
+ self.getscreen().update()
+
+ def pentl(self, side, ang, scale):
+ if side < (2 * scale): return
+ self.forward(side)
+ self.left(ang)
+ self.pentl(side - (.38 * scale), ang, scale)
+
+ def pentr(self, side, ang, scale):
+ if side < (2 * scale): return
+ self.forward(side)
+ self.right(ang)
+ self.pentr(side - (.38 * scale), ang, scale)
+
+ def tripolyr(self, side, scale):
+ if side < (4 * scale): return
+ self.forward(side)
+ self.right(111)
+ self.forward(side / 1.78)
+ self.right(111)
+ self.forward(side / 1.3)
+ self.right(146)
+ self.tripolyr(side * .75, scale)
+
+ def tripolyl(self, side, scale):
+ if side < (4 * scale): return
+ self.forward(side)
+ self.left(111)
+ self.forward(side / 1.78)
+ self.left(111)
+ self.forward(side / 1.3)
+ self.left(146)
+ self.tripolyl(side * .75, scale)
+
+ def centerpiece(self, s, a, scale):
+ self.forward(s); self.left(a)
+ if s < (7.5 * scale):
+ return
+ self.centerpiece(s - (1.2 * scale), a, scale)
+
+def main():
+ t = Designer()
+ t.speed(0)
+ t.hideturtle()
+ t.getscreen().delay(0)
+ t.getscreen().tracer(0)
+ at = clock()
+ t.design(t.position(), 2)
+ et = clock()
+ return "runtime: %.2f sec." % (et-at)
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/chaos.py b/rootfs/usr/lib/python3.8/turtledemo/chaos.py
new file mode 100644
index 0000000..6a45d0d
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/chaos.py
@@ -0,0 +1,59 @@
+# File: tdemo_chaos.py
+# Author: Gregor Lingl
+# Date: 2009-06-24
+
+# A demonstration of chaos
+
+from turtle import *
+
+N = 80
+
+def f(x):
+ return 3.9*x*(1-x)
+
+def g(x):
+ return 3.9*(x-x**2)
+
+def h(x):
+ return 3.9*x-3.9*x*x
+
+def jumpto(x, y):
+ penup(); goto(x,y)
+
+def line(x1, y1, x2, y2):
+ jumpto(x1, y1)
+ pendown()
+ goto(x2, y2)
+
+def coosys():
+ line(-1, 0, N+1, 0)
+ line(0, -0.1, 0, 1.1)
+
+def plot(fun, start, color):
+ pencolor(color)
+ x = start
+ jumpto(0, x)
+ pendown()
+ dot(5)
+ for i in range(N):
+ x=fun(x)
+ goto(i+1,x)
+ dot(5)
+
+def main():
+ reset()
+ setworldcoordinates(-1.0,-0.1, N+1, 1.1)
+ speed(0)
+ hideturtle()
+ coosys()
+ plot(f, 0.35, "blue")
+ plot(g, 0.35, "green")
+ plot(h, 0.35, "red")
+ # Now zoom in:
+ for s in range(100):
+ setworldcoordinates(0.5*s,-0.1, N+1, 1.1)
+ return "Done!"
+
+if __name__ == "__main__":
+ main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/clock.py b/rootfs/usr/lib/python3.8/turtledemo/clock.py
new file mode 100755
index 0000000..62c8851
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/clock.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python3
+# -*- coding: cp1252 -*-
+""" turtle-example-suite:
+
+ tdemo_clock.py
+
+Enhanced clock-program, showing date
+and time
+ ------------------------------------
+ Press STOP to exit the program!
+ ------------------------------------
+"""
+from turtle import *
+from datetime import datetime
+
+def jump(distanz, winkel=0):
+ penup()
+ right(winkel)
+ forward(distanz)
+ left(winkel)
+ pendown()
+
+def hand(laenge, spitze):
+ fd(laenge*1.15)
+ rt(90)
+ fd(spitze/2.0)
+ lt(120)
+ fd(spitze)
+ lt(120)
+ fd(spitze)
+ lt(120)
+ fd(spitze/2.0)
+
+def make_hand_shape(name, laenge, spitze):
+ reset()
+ jump(-laenge*0.15)
+ begin_poly()
+ hand(laenge, spitze)
+ end_poly()
+ hand_form = get_poly()
+ register_shape(name, hand_form)
+
+def clockface(radius):
+ reset()
+ pensize(7)
+ for i in range(60):
+ jump(radius)
+ if i % 5 == 0:
+ fd(25)
+ jump(-radius-25)
+ else:
+ dot(3)
+ jump(-radius)
+ rt(6)
+
+def setup():
+ global second_hand, minute_hand, hour_hand, writer
+ mode("logo")
+ make_hand_shape("second_hand", 125, 25)
+ make_hand_shape("minute_hand", 130, 25)
+ make_hand_shape("hour_hand", 90, 25)
+ clockface(160)
+ second_hand = Turtle()
+ second_hand.shape("second_hand")
+ second_hand.color("gray20", "gray80")
+ minute_hand = Turtle()
+ minute_hand.shape("minute_hand")
+ minute_hand.color("blue1", "red1")
+ hour_hand = Turtle()
+ hour_hand.shape("hour_hand")
+ hour_hand.color("blue3", "red3")
+ for hand in second_hand, minute_hand, hour_hand:
+ hand.resizemode("user")
+ hand.shapesize(1, 1, 3)
+ hand.speed(0)
+ ht()
+ writer = Turtle()
+ #writer.mode("logo")
+ writer.ht()
+ writer.pu()
+ writer.bk(85)
+
+def wochentag(t):
+ wochentag = ["Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday", "Sunday"]
+ return wochentag[t.weekday()]
+
+def datum(z):
+ monat = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June",
+ "July", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."]
+ j = z.year
+ m = monat[z.month - 1]
+ t = z.day
+ return "%s %d %d" % (m, t, j)
+
+def tick():
+ t = datetime.today()
+ sekunde = t.second + t.microsecond*0.000001
+ minute = t.minute + sekunde/60.0
+ stunde = t.hour + minute/60.0
+ try:
+ tracer(False) # Terminator can occur here
+ writer.clear()
+ writer.home()
+ writer.forward(65)
+ writer.write(wochentag(t),
+ align="center", font=("Courier", 14, "bold"))
+ writer.back(150)
+ writer.write(datum(t),
+ align="center", font=("Courier", 14, "bold"))
+ writer.forward(85)
+ tracer(True)
+ second_hand.setheading(6*sekunde) # or here
+ minute_hand.setheading(6*minute)
+ hour_hand.setheading(30*stunde)
+ tracer(True)
+ ontimer(tick, 100)
+ except Terminator:
+ pass # turtledemo user pressed STOP
+
+def main():
+ tracer(False)
+ setup()
+ tracer(True)
+ tick()
+ return "EVENTLOOP"
+
+if __name__ == "__main__":
+ mode("logo")
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/colormixer.py b/rootfs/usr/lib/python3.8/turtledemo/colormixer.py
new file mode 100644
index 0000000..448db83
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/colormixer.py
@@ -0,0 +1,58 @@
+# colormixer
+
+from turtle import Screen, Turtle, mainloop
+
+class ColorTurtle(Turtle):
+
+ def __init__(self, x, y):
+ Turtle.__init__(self)
+ self.shape("turtle")
+ self.resizemode("user")
+ self.shapesize(3,3,5)
+ self.pensize(10)
+ self._color = [0,0,0]
+ self.x = x
+ self._color[x] = y
+ self.color(self._color)
+ self.speed(0)
+ self.left(90)
+ self.pu()
+ self.goto(x,0)
+ self.pd()
+ self.sety(1)
+ self.pu()
+ self.sety(y)
+ self.pencolor("gray25")
+ self.ondrag(self.shift)
+
+ def shift(self, x, y):
+ self.sety(max(0,min(y,1)))
+ self._color[self.x] = self.ycor()
+ self.fillcolor(self._color)
+ setbgcolor()
+
+def setbgcolor():
+ screen.bgcolor(red.ycor(), green.ycor(), blue.ycor())
+
+def main():
+ global screen, red, green, blue
+ screen = Screen()
+ screen.delay(0)
+ screen.setworldcoordinates(-1, -0.3, 3, 1.3)
+
+ red = ColorTurtle(0, .5)
+ green = ColorTurtle(1, .5)
+ blue = ColorTurtle(2, .5)
+ setbgcolor()
+
+ writer = Turtle()
+ writer.ht()
+ writer.pu()
+ writer.goto(1,1.15)
+ writer.write("DRAG!",align="center",font=("Arial",30,("bold","italic")))
+ return "EVENTLOOP"
+
+if __name__ == "__main__":
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/forest.py b/rootfs/usr/lib/python3.8/turtledemo/forest.py
new file mode 100755
index 0000000..55b7da9
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/forest.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+""" turtlegraphics-example-suite:
+
+ tdemo_forest.py
+
+Displays a 'forest' of 3 breadth-first-trees
+similar to the one in tree.
+For further remarks see tree.py
+
+This example is a 'breadth-first'-rewrite of
+a Logo program written by Erich Neuwirth. See
+http://homepage.univie.ac.at/erich.neuwirth/
+"""
+from turtle import Turtle, colormode, tracer, mainloop
+from random import randrange
+from time import perf_counter as clock
+
+def symRandom(n):
+ return randrange(-n,n+1)
+
+def randomize( branchlist, angledist, sizedist ):
+ return [ (angle+symRandom(angledist),
+ sizefactor*1.01**symRandom(sizedist))
+ for angle, sizefactor in branchlist ]
+
+def randomfd( t, distance, parts, angledist ):
+ for i in range(parts):
+ t.left(symRandom(angledist))
+ t.forward( (1.0 * distance)/parts )
+
+def tree(tlist, size, level, widthfactor, branchlists, angledist=10, sizedist=5):
+ # benutzt Liste von turtles und Liste von Zweiglisten,
+ # fuer jede turtle eine!
+ if level > 0:
+ lst = []
+ brs = []
+ for t, branchlist in list(zip(tlist,branchlists)):
+ t.pensize( size * widthfactor )
+ t.pencolor( 255 - (180 - 11 * level + symRandom(15)),
+ 180 - 11 * level + symRandom(15),
+ 0 )
+ t.pendown()
+ randomfd(t, size, level, angledist )
+ yield 1
+ for angle, sizefactor in branchlist:
+ t.left(angle)
+ lst.append(t.clone())
+ brs.append(randomize(branchlist, angledist, sizedist))
+ t.right(angle)
+ for x in tree(lst, size*sizefactor, level-1, widthfactor, brs,
+ angledist, sizedist):
+ yield None
+
+
+def start(t,x,y):
+ colormode(255)
+ t.reset()
+ t.speed(0)
+ t.hideturtle()
+ t.left(90)
+ t.penup()
+ t.setpos(x,y)
+ t.pendown()
+
+def doit1(level, pen):
+ pen.hideturtle()
+ start(pen, 20, -208)
+ t = tree( [pen], 80, level, 0.1, [[ (45,0.69), (0,0.65), (-45,0.71) ]] )
+ return t
+
+def doit2(level, pen):
+ pen.hideturtle()
+ start(pen, -135, -130)
+ t = tree( [pen], 120, level, 0.1, [[ (45,0.69), (-45,0.71) ]] )
+ return t
+
+def doit3(level, pen):
+ pen.hideturtle()
+ start(pen, 190, -90)
+ t = tree( [pen], 100, level, 0.1, [[ (45,0.7), (0,0.72), (-45,0.65) ]] )
+ return t
+
+# Hier 3 Baumgeneratoren:
+def main():
+ p = Turtle()
+ p.ht()
+ tracer(75,0)
+ u = doit1(6, Turtle(undobuffersize=1))
+ s = doit2(7, Turtle(undobuffersize=1))
+ t = doit3(5, Turtle(undobuffersize=1))
+ a = clock()
+ while True:
+ done = 0
+ for b in u,s,t:
+ try:
+ b.__next__()
+ except:
+ done += 1
+ if done == 3:
+ break
+
+ tracer(1,10)
+ b = clock()
+ return "runtime: %.2f sec." % (b-a)
+
+if __name__ == '__main__':
+ main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/fractalcurves.py b/rootfs/usr/lib/python3.8/turtledemo/fractalcurves.py
new file mode 100755
index 0000000..54ade96
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/fractalcurves.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_fractalCurves.py
+
+This program draws two fractal-curve-designs:
+(1) A hilbert curve (in a box)
+(2) A combination of Koch-curves.
+
+The CurvesTurtle class and the fractal-curve-
+methods are taken from the PythonCard example
+scripts for turtle-graphics.
+"""
+from turtle import *
+from time import sleep, perf_counter as clock
+
+class CurvesTurtle(Pen):
+ # example derived from
+ # Turtle Geometry: The Computer as a Medium for Exploring Mathematics
+ # by Harold Abelson and Andrea diSessa
+ # p. 96-98
+ def hilbert(self, size, level, parity):
+ if level == 0:
+ return
+ # rotate and draw first subcurve with opposite parity to big curve
+ self.left(parity * 90)
+ self.hilbert(size, level - 1, -parity)
+ # interface to and draw second subcurve with same parity as big curve
+ self.forward(size)
+ self.right(parity * 90)
+ self.hilbert(size, level - 1, parity)
+ # third subcurve
+ self.forward(size)
+ self.hilbert(size, level - 1, parity)
+ # fourth subcurve
+ self.right(parity * 90)
+ self.forward(size)
+ self.hilbert(size, level - 1, -parity)
+ # a final turn is needed to make the turtle
+ # end up facing outward from the large square
+ self.left(parity * 90)
+
+ # Visual Modeling with Logo: A Structural Approach to Seeing
+ # by James Clayson
+ # Koch curve, after Helge von Koch who introduced this geometric figure in 1904
+ # p. 146
+ def fractalgon(self, n, rad, lev, dir):
+ import math
+
+ # if dir = 1 turn outward
+ # if dir = -1 turn inward
+ edge = 2 * rad * math.sin(math.pi / n)
+ self.pu()
+ self.fd(rad)
+ self.pd()
+ self.rt(180 - (90 * (n - 2) / n))
+ for i in range(n):
+ self.fractal(edge, lev, dir)
+ self.rt(360 / n)
+ self.lt(180 - (90 * (n - 2) / n))
+ self.pu()
+ self.bk(rad)
+ self.pd()
+
+ # p. 146
+ def fractal(self, dist, depth, dir):
+ if depth < 1:
+ self.fd(dist)
+ return
+ self.fractal(dist / 3, depth - 1, dir)
+ self.lt(60 * dir)
+ self.fractal(dist / 3, depth - 1, dir)
+ self.rt(120 * dir)
+ self.fractal(dist / 3, depth - 1, dir)
+ self.lt(60 * dir)
+ self.fractal(dist / 3, depth - 1, dir)
+
+def main():
+ ft = CurvesTurtle()
+
+ ft.reset()
+ ft.speed(0)
+ ft.ht()
+ ft.getscreen().tracer(1,0)
+ ft.pu()
+
+ size = 6
+ ft.setpos(-33*size, -32*size)
+ ft.pd()
+
+ ta=clock()
+ ft.fillcolor("red")
+ ft.begin_fill()
+ ft.fd(size)
+
+ ft.hilbert(size, 6, 1)
+
+ # frame
+ ft.fd(size)
+ for i in range(3):
+ ft.lt(90)
+ ft.fd(size*(64+i%2))
+ ft.pu()
+ for i in range(2):
+ ft.fd(size)
+ ft.rt(90)
+ ft.pd()
+ for i in range(4):
+ ft.fd(size*(66+i%2))
+ ft.rt(90)
+ ft.end_fill()
+ tb=clock()
+ res = "Hilbert: %.2fsec. " % (tb-ta)
+
+ sleep(3)
+
+ ft.reset()
+ ft.speed(0)
+ ft.ht()
+ ft.getscreen().tracer(1,0)
+
+ ta=clock()
+ ft.color("black", "blue")
+ ft.begin_fill()
+ ft.fractalgon(3, 250, 4, 1)
+ ft.end_fill()
+ ft.begin_fill()
+ ft.color("red")
+ ft.fractalgon(3, 200, 4, -1)
+ ft.end_fill()
+ tb=clock()
+ res += "Koch: %.2fsec." % (tb-ta)
+ return res
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/lindenmayer.py b/rootfs/usr/lib/python3.8/turtledemo/lindenmayer.py
new file mode 100755
index 0000000..3925f25
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/lindenmayer.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ xtx_lindenmayer_indian.py
+
+Each morning women in Tamil Nadu, in southern
+India, place designs, created by using rice
+flour and known as kolam on the thresholds of
+their homes.
+
+These can be described by Lindenmayer systems,
+which can easily be implemented with turtle
+graphics and Python.
+
+Two examples are shown here:
+(1) the snake kolam
+(2) anklets of Krishna
+
+Taken from Marcia Ascher: Mathematics
+Elsewhere, An Exploration of Ideas Across
+Cultures
+
+"""
+################################
+# Mini Lindenmayer tool
+###############################
+
+from turtle import *
+
+def replace( seq, replacementRules, n ):
+ for i in range(n):
+ newseq = ""
+ for element in seq:
+ newseq = newseq + replacementRules.get(element,element)
+ seq = newseq
+ return seq
+
+def draw( commands, rules ):
+ for b in commands:
+ try:
+ rules[b]()
+ except TypeError:
+ try:
+ draw(rules[b], rules)
+ except:
+ pass
+
+
+def main():
+ ################################
+ # Example 1: Snake kolam
+ ################################
+
+
+ def r():
+ right(45)
+
+ def l():
+ left(45)
+
+ def f():
+ forward(7.5)
+
+ snake_rules = {"-":r, "+":l, "f":f, "b":"f+f+f--f--f+f+f"}
+ snake_replacementRules = {"b": "b+f+b--f--b+f+b"}
+ snake_start = "b--f--b--f"
+
+ drawing = replace(snake_start, snake_replacementRules, 3)
+
+ reset()
+ speed(3)
+ tracer(1,0)
+ ht()
+ up()
+ backward(195)
+ down()
+ draw(drawing, snake_rules)
+
+ from time import sleep
+ sleep(3)
+
+ ################################
+ # Example 2: Anklets of Krishna
+ ################################
+
+ def A():
+ color("red")
+ circle(10,90)
+
+ def B():
+ from math import sqrt
+ color("black")
+ l = 5/sqrt(2)
+ forward(l)
+ circle(l, 270)
+ forward(l)
+
+ def F():
+ color("green")
+ forward(10)
+
+ krishna_rules = {"a":A, "b":B, "f":F}
+ krishna_replacementRules = {"a" : "afbfa", "b" : "afbfbfbfa" }
+ krishna_start = "fbfbfbfb"
+
+ reset()
+ speed(0)
+ tracer(3,0)
+ ht()
+ left(45)
+ drawing = replace(krishna_start, krishna_replacementRules, 3)
+ draw(drawing, krishna_rules)
+ tracer(1)
+ return "Done!"
+
+if __name__=='__main__':
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/minimal_hanoi.py b/rootfs/usr/lib/python3.8/turtledemo/minimal_hanoi.py
new file mode 100755
index 0000000..4a432f2
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/minimal_hanoi.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_minimal_hanoi.py
+
+A minimal 'Towers of Hanoi' animation:
+A tower of 6 discs is transferred from the
+left to the right peg.
+
+An imho quite elegant and concise
+implementation using a tower class, which
+is derived from the built-in type list.
+
+Discs are turtles with shape "square", but
+stretched to rectangles by shapesize()
+ ---------------------------------------
+ To exit press STOP button
+ ---------------------------------------
+"""
+from turtle import *
+
+class Disc(Turtle):
+ def __init__(self, n):
+ Turtle.__init__(self, shape="square", visible=False)
+ self.pu()
+ self.shapesize(1.5, n*1.5, 2) # square-->rectangle
+ self.fillcolor(n/6., 0, 1-n/6.)
+ self.st()
+
+class Tower(list):
+ "Hanoi tower, a subclass of built-in type list"
+ def __init__(self, x):
+ "create an empty tower. x is x-position of peg"
+ self.x = x
+ def push(self, d):
+ d.setx(self.x)
+ d.sety(-150+34*len(self))
+ self.append(d)
+ def pop(self):
+ d = list.pop(self)
+ d.sety(150)
+ return d
+
+def hanoi(n, from_, with_, to_):
+ if n > 0:
+ hanoi(n-1, from_, to_, with_)
+ to_.push(from_.pop())
+ hanoi(n-1, with_, from_, to_)
+
+def play():
+ onkey(None,"space")
+ clear()
+ try:
+ hanoi(6, t1, t2, t3)
+ write("press STOP button to exit",
+ align="center", font=("Courier", 16, "bold"))
+ except Terminator:
+ pass # turtledemo user pressed STOP
+
+def main():
+ global t1, t2, t3
+ ht(); penup(); goto(0, -225) # writer turtle
+ t1 = Tower(-250)
+ t2 = Tower(0)
+ t3 = Tower(250)
+ # make tower of 6 discs
+ for i in range(6,0,-1):
+ t1.push(Disc(i))
+ # prepare spartanic user interface ;-)
+ write("press spacebar to start game",
+ align="center", font=("Courier", 16, "bold"))
+ onkey(play, "space")
+ listen()
+ return "EVENTLOOP"
+
+if __name__=="__main__":
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/nim.py b/rootfs/usr/lib/python3.8/turtledemo/nim.py
new file mode 100644
index 0000000..9ae6cc5
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/nim.py
@@ -0,0 +1,226 @@
+""" turtle-example-suite:
+
+ tdemo_nim.py
+
+Play nim against the computer. The player
+who takes the last stick is the winner.
+
+Implements the model-view-controller
+design pattern.
+"""
+
+
+import turtle
+import random
+import time
+
+SCREENWIDTH = 640
+SCREENHEIGHT = 480
+
+MINSTICKS = 7
+MAXSTICKS = 31
+
+HUNIT = SCREENHEIGHT // 12
+WUNIT = SCREENWIDTH // ((MAXSTICKS // 5) * 11 + (MAXSTICKS % 5) * 2)
+
+SCOLOR = (63, 63, 31)
+HCOLOR = (255, 204, 204)
+COLOR = (204, 204, 255)
+
+def randomrow():
+ return random.randint(MINSTICKS, MAXSTICKS)
+
+def computerzug(state):
+ xored = state[0] ^ state[1] ^ state[2]
+ if xored == 0:
+ return randommove(state)
+ for z in range(3):
+ s = state[z] ^ xored
+ if s <= state[z]:
+ move = (z, s)
+ return move
+
+def randommove(state):
+ m = max(state)
+ while True:
+ z = random.randint(0,2)
+ if state[z] > (m > 1):
+ break
+ rand = random.randint(m > 1, state[z]-1)
+ return z, rand
+
+
+class NimModel(object):
+ def __init__(self, game):
+ self.game = game
+
+ def setup(self):
+ if self.game.state not in [Nim.CREATED, Nim.OVER]:
+ return
+ self.sticks = [randomrow(), randomrow(), randomrow()]
+ self.player = 0
+ 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
+ self.game.view.notify_move(row, col, maxspalte, self.player)
+ if self.game_over():
+ self.game.state = Nim.OVER
+ self.winner = self.player
+ self.game.view.notify_over()
+ elif self.player == 0:
+ self.player = 1
+ row, col = computerzug(self.sticks)
+ self.move(row, col)
+ self.player = 0
+
+ def game_over(self):
+ return self.sticks == [0, 0, 0]
+
+ def notify_move(self, row, col):
+ if self.sticks[row] <= col:
+ return
+ self.move(row, col)
+
+
+class Stick(turtle.Turtle):
+ def __init__(self, row, col, game):
+ turtle.Turtle.__init__(self, visible=False)
+ self.row = row
+ self.col = col
+ self.game = game
+ x, y = self.coords(row, col)
+ self.shape("square")
+ self.shapesize(HUNIT/10.0, WUNIT/20.0)
+ self.speed(0)
+ self.pu()
+ 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
+ self.game.controller.notify_move(self.row, self.col)
+
+
+class NimView(object):
+ def __init__(self, game):
+ self.game = game
+ self.screen = game.screen
+ self.model = game.model
+ self.screen.colormode(255)
+ self.screen.tracer(False)
+ self.screen.bgcolor((240, 240, 255))
+ self.writer = turtle.Turtle(visible=False)
+ self.writer.pu()
+ self.writer.speed(0)
+ self.sticks = {}
+ for row in range(3):
+ for col in range(MAXSTICKS):
+ self.sticks[(row, col)] = Stick(row, col, game)
+ self.display("... a moment please ...")
+ self.screen.tracer(True)
+
+ def display(self, msg1, msg2=None):
+ self.screen.tracer(False)
+ self.writer.clear()
+ if msg2 is not None:
+ self.writer.goto(0, - SCREENHEIGHT // 2 + 48)
+ self.writer.pencolor("red")
+ self.writer.write(msg2, align="center", font=("Courier",18,"bold"))
+ self.writer.goto(0, - SCREENHEIGHT // 2 + 20)
+ 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)
+ for row in range(3):
+ for col in range(self.model.sticks[row]):
+ self.sticks[(row, col)].color(SCOLOR)
+ for row in range(3):
+ for col in range(self.model.sticks[row], MAXSTICKS):
+ self.sticks[(row, col)].color("white")
+ self.display("Your turn! Click leftmost stick to remove.")
+ self.screen.tracer(True)
+
+ def notify_move(self, row, col, maxspalte, player):
+ if player == 0:
+ farbe = HCOLOR
+ for s in range(col, maxspalte):
+ self.sticks[(row, s)].color(farbe)
+ else:
+ self.display(" ... thinking ... ")
+ time.sleep(0.5)
+ self.display(" ... thinking ... aaah ...")
+ farbe = COLOR
+ for s in range(maxspalte-1, col-1, -1):
+ time.sleep(0.2)
+ self.sticks[(row, s)].color(farbe)
+ self.display("Your turn! Click leftmost stick to remove.")
+
+ def notify_over(self):
+ if self.game.model.winner == 0:
+ msg2 = "Congrats. You're the winner!!!"
+ else:
+ msg2 = "Sorry, the computer is the winner."
+ self.display("To play again press space bar. To leave press ESC.", msg2)
+
+ def clear(self):
+ if self.game.state == Nim.OVER:
+ self.screen.clear()
+
+
+class NimController(object):
+
+ def __init__(self, game):
+ self.game = game
+ self.sticks = game.view.sticks
+ self.BUSY = False
+ for stick in self.sticks.values():
+ stick.onclick(stick.makemove)
+ self.game.screen.onkey(self.game.model.setup, "space")
+ self.game.screen.onkey(self.game.view.clear, "Escape")
+ self.game.view.display("Press space bar to start game")
+ self.game.screen.listen()
+
+ def notify_move(self, row, col):
+ if self.BUSY:
+ return
+ 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.screen = screen
+ self.model = NimModel(self)
+ self.view = NimView(self)
+ self.controller = NimController(self)
+
+
+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/rootfs/usr/lib/python3.8/turtledemo/paint.py b/rootfs/usr/lib/python3.8/turtledemo/paint.py
new file mode 100755
index 0000000..fc6852a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/paint.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_paint.py
+
+A simple event-driven paint program
+
+- left mouse button moves turtle
+- middle mouse button changes color
+- right mouse button toggles between pen up
+(no line drawn when the turtle moves) and
+pen down (line is drawn). If pen up follows
+at least two pen-down moves, the polygon that
+includes the starting point is filled.
+ -------------------------------------------
+ Play around by clicking into the canvas
+ using all three mouse buttons.
+ -------------------------------------------
+ To exit press STOP button
+ -------------------------------------------
+"""
+from turtle import *
+
+def switchupdown(x=0, y=0):
+ if pen()["pendown"]:
+ end_fill()
+ up()
+ else:
+ down()
+ begin_fill()
+
+def changecolor(x=0, y=0):
+ global colors
+ colors = colors[1:]+colors[:1]
+ color(colors[0])
+
+def main():
+ global colors
+ shape("circle")
+ resizemode("user")
+ shapesize(.5)
+ width(3)
+ colors=["red", "green", "blue", "yellow"]
+ color(colors[0])
+ switchupdown()
+ onscreenclick(goto,1)
+ onscreenclick(changecolor,2)
+ onscreenclick(switchupdown,3)
+ return "EVENTLOOP"
+
+if __name__ == "__main__":
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/peace.py b/rootfs/usr/lib/python3.8/turtledemo/peace.py
new file mode 100755
index 0000000..e2ba928
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/peace.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_peace.py
+
+A simple drawing suitable as a beginner's
+programming example. Aside from the
+peacecolors assignment and the for loop,
+it only uses turtle commands.
+"""
+
+from turtle import *
+
+def main():
+ peacecolors = ("red3", "orange", "yellow",
+ "seagreen4", "orchid4",
+ "royalblue1", "dodgerblue4")
+
+ reset()
+ Screen()
+ up()
+ goto(-320,-195)
+ width(70)
+
+ for pcolor in peacecolors:
+ color(pcolor)
+ down()
+ forward(640)
+ up()
+ backward(640)
+ left(90)
+ forward(66)
+ right(90)
+
+ width(25)
+ color("white")
+ goto(0,-170)
+ down()
+
+ circle(170)
+ left(90)
+ forward(340)
+ up()
+ left(180)
+ forward(170)
+ right(45)
+ down()
+ forward(170)
+ up()
+ backward(170)
+ left(90)
+ down()
+ forward(170)
+ up()
+
+ goto(0,300) # vanish if hideturtle() is not available ;-)
+ return "Done!"
+
+if __name__ == "__main__":
+ main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/penrose.py b/rootfs/usr/lib/python3.8/turtledemo/penrose.py
new file mode 100755
index 0000000..045722a
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/penrose.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python3
+""" xturtle-example-suite:
+
+ xtx_kites_and_darts.py
+
+Constructs two aperiodic penrose-tilings,
+consisting of kites and darts, by the method
+of inflation in six steps.
+
+Starting points are the patterns "sun"
+consisting of five kites and "star"
+consisting of five darts.
+
+For more information see:
+ http://en.wikipedia.org/wiki/Penrose_tiling
+ -------------------------------------------
+"""
+from turtle import *
+from math import cos, pi
+from time import perf_counter as clock, sleep
+
+f = (5**0.5-1)/2.0 # (sqrt(5)-1)/2 -- golden ratio
+d = 2 * cos(3*pi/10)
+
+def kite(l):
+ fl = f * l
+ lt(36)
+ fd(l)
+ rt(108)
+ fd(fl)
+ rt(36)
+ fd(fl)
+ rt(108)
+ fd(l)
+ rt(144)
+
+def dart(l):
+ fl = f * l
+ lt(36)
+ fd(l)
+ rt(144)
+ fd(fl)
+ lt(36)
+ fd(fl)
+ rt(144)
+ fd(l)
+ rt(144)
+
+def inflatekite(l, n):
+ if n == 0:
+ px, py = pos()
+ h, x, y = int(heading()), round(px,3), round(py,3)
+ tiledict[(h,x,y)] = True
+ return
+ fl = f * l
+ lt(36)
+ inflatedart(fl, n-1)
+ fd(l)
+ rt(144)
+ inflatekite(fl, n-1)
+ lt(18)
+ fd(l*d)
+ rt(162)
+ inflatekite(fl, n-1)
+ lt(36)
+ fd(l)
+ rt(180)
+ inflatedart(fl, n-1)
+ lt(36)
+
+def inflatedart(l, n):
+ if n == 0:
+ px, py = pos()
+ h, x, y = int(heading()), round(px,3), round(py,3)
+ tiledict[(h,x,y)] = False
+ return
+ fl = f * l
+ inflatekite(fl, n-1)
+ lt(36)
+ fd(l)
+ rt(180)
+ inflatedart(fl, n-1)
+ lt(54)
+ fd(l*d)
+ rt(126)
+ inflatedart(fl, n-1)
+ fd(l)
+ rt(144)
+
+def draw(l, n, th=2):
+ clear()
+ l = l * f**n
+ shapesize(l/100.0, l/100.0, th)
+ for k in tiledict:
+ h, x, y = k
+ setpos(x, y)
+ setheading(h)
+ if tiledict[k]:
+ shape("kite")
+ color("black", (0, 0.75, 0))
+ else:
+ shape("dart")
+ color("black", (0.75, 0, 0))
+ stamp()
+
+def sun(l, n):
+ for i in range(5):
+ inflatekite(l, n)
+ lt(72)
+
+def star(l,n):
+ for i in range(5):
+ inflatedart(l, n)
+ lt(72)
+
+def makeshapes():
+ tracer(0)
+ begin_poly()
+ kite(100)
+ end_poly()
+ register_shape("kite", get_poly())
+ begin_poly()
+ dart(100)
+ end_poly()
+ register_shape("dart", get_poly())
+ tracer(1)
+
+def start():
+ reset()
+ ht()
+ pu()
+ makeshapes()
+ resizemode("user")
+
+def test(l=200, n=4, fun=sun, startpos=(0,0), th=2):
+ global tiledict
+ goto(startpos)
+ setheading(0)
+ tiledict = {}
+ tracer(0)
+ fun(l, n)
+ draw(l, n, th)
+ tracer(1)
+ nk = len([x for x in tiledict if tiledict[x]])
+ nd = len([x for x in tiledict if not tiledict[x]])
+ print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd))
+
+def demo(fun=sun):
+ start()
+ for i in range(8):
+ a = clock()
+ test(300, i, fun)
+ b = clock()
+ t = b - a
+ if t < 2:
+ sleep(2 - t)
+
+def main():
+ #title("Penrose-tiling with kites and darts.")
+ mode("logo")
+ bgcolor(0.3, 0.3, 0)
+ demo(sun)
+ sleep(2)
+ demo(star)
+ pencolor("black")
+ goto(0,-200)
+ pencolor(0.7,0.7,1)
+ write("Please wait...",
+ align="center", font=('Arial Black', 36, 'bold'))
+ test(600, 8, startpos=(70, 117))
+ return "Done"
+
+if __name__ == "__main__":
+ msg = main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/planet_and_moon.py b/rootfs/usr/lib/python3.8/turtledemo/planet_and_moon.py
new file mode 100755
index 0000000..021ff99
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/planet_and_moon.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_planets_and_moon.py
+
+Gravitational system simulation using the
+approximation method from Feynman-lectures,
+p.9-8, using turtlegraphics.
+
+Example: heavy central body, light planet,
+very light moon!
+Planet has a circular orbit, moon a stable
+orbit around the planet.
+
+You can hold the movement temporarily by
+pressing the left mouse button with the
+mouse over the scrollbar of the canvas.
+
+"""
+from turtle import Shape, Turtle, mainloop, Vec2D as Vec
+
+G = 8
+
+class GravSys(object):
+ def __init__(self):
+ self.planets = []
+ self.t = 0
+ self.dt = 0.01
+ def init(self):
+ for p in self.planets:
+ p.init()
+ def start(self):
+ for i in range(10000):
+ self.t += self.dt
+ for p in self.planets:
+ p.step()
+
+class Star(Turtle):
+ def __init__(self, m, x, v, gravSys, shape):
+ Turtle.__init__(self, shape=shape)
+ self.penup()
+ self.m = m
+ self.setpos(x)
+ self.v = v
+ gravSys.planets.append(self)
+ self.gravSys = gravSys
+ self.resizemode("user")
+ self.pendown()
+ def init(self):
+ dt = self.gravSys.dt
+ self.a = self.acc()
+ self.v = self.v + 0.5*dt*self.a
+ def acc(self):
+ a = Vec(0,0)
+ for planet in self.gravSys.planets:
+ if planet != self:
+ v = planet.pos()-self.pos()
+ a += (G*planet.m/abs(v)**3)*v
+ return a
+ def step(self):
+ dt = self.gravSys.dt
+ self.setpos(self.pos() + dt*self.v)
+ if self.gravSys.planets.index(self) != 0:
+ self.setheading(self.towards(self.gravSys.planets[0]))
+ self.a = self.acc()
+ self.v = self.v + dt*self.a
+
+## create compound yellow/blue turtleshape for planets
+
+def main():
+ s = Turtle()
+ s.reset()
+ s.getscreen().tracer(0,0)
+ s.ht()
+ s.pu()
+ s.fd(6)
+ s.lt(90)
+ s.begin_poly()
+ s.circle(6, 180)
+ s.end_poly()
+ m1 = s.get_poly()
+ s.begin_poly()
+ s.circle(6,180)
+ s.end_poly()
+ m2 = s.get_poly()
+
+ planetshape = Shape("compound")
+ planetshape.addcomponent(m1,"orange")
+ planetshape.addcomponent(m2,"blue")
+ s.getscreen().register_shape("planet", planetshape)
+ s.getscreen().tracer(1,0)
+
+ ## setup gravitational system
+ gs = GravSys()
+ sun = Star(1000000, Vec(0,0), Vec(0,-2.5), gs, "circle")
+ sun.color("yellow")
+ sun.shapesize(1.8)
+ sun.pu()
+ earth = Star(12500, Vec(210,0), Vec(0,195), gs, "planet")
+ earth.pencolor("green")
+ earth.shapesize(0.8)
+ moon = Star(1, Vec(220,0), Vec(0,295), gs, "planet")
+ moon.pencolor("blue")
+ moon.shapesize(0.5)
+ gs.init()
+ gs.start()
+ return "Done!"
+
+if __name__ == '__main__':
+ main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/rosette.py b/rootfs/usr/lib/python3.8/turtledemo/rosette.py
new file mode 100644
index 0000000..47d0f00
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/rosette.py
@@ -0,0 +1,65 @@
+""" turtle-example-suite:
+
+ tdemo_wikipedia3.py
+
+This example is
+inspired by the Wikipedia article on turtle
+graphics. (See example wikipedia1 for URLs)
+
+First we create (ne-1) (i.e. 35 in this
+example) copies of our first turtle p.
+Then we let them perform their steps in
+parallel.
+
+Followed by a complete undo().
+"""
+from turtle import Screen, Turtle, mainloop
+from time import perf_counter as clock, sleep
+
+def mn_eck(p, ne,sz):
+ turtlelist = [p]
+ #create ne-1 additional turtles
+ for i in range(1,ne):
+ q = p.clone()
+ q.rt(360.0/ne)
+ turtlelist.append(q)
+ p = q
+ for i in range(ne):
+ c = abs(ne/2.0-i)/(ne*.7)
+ # let those ne turtles make a step
+ # in parallel:
+ for t in turtlelist:
+ t.rt(360./ne)
+ t.pencolor(1-c,0,c)
+ t.fd(sz)
+
+def main():
+ s = Screen()
+ s.bgcolor("black")
+ p=Turtle()
+ p.speed(0)
+ p.hideturtle()
+ p.pencolor("red")
+ p.pensize(3)
+
+ s.tracer(36,0)
+
+ at = clock()
+ mn_eck(p, 36, 19)
+ et = clock()
+ z1 = et-at
+
+ sleep(1)
+
+ at = clock()
+ while any(t.undobufferentries() for t in s.turtles()):
+ for t in s.turtles():
+ t.undo()
+ et = clock()
+ return "runtime: %.3f sec" % (z1+et-at)
+
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/round_dance.py b/rootfs/usr/lib/python3.8/turtledemo/round_dance.py
new file mode 100644
index 0000000..1038361
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/round_dance.py
@@ -0,0 +1,86 @@
+""" turtle-example-suite:
+
+ tdemo_round_dance.py
+
+(Needs version 1.1 of the turtle module that
+comes with Python 3.1)
+
+Dancing turtles have a compound shape
+consisting of a series of triangles of
+decreasing size.
+
+Turtles march along a circle while rotating
+pairwise in opposite direction, with one
+exception. Does that breaking of symmetry
+enhance the attractiveness of the example?
+
+Press any key to stop the animation.
+
+Technically: demonstrates use of compound
+shapes, transformation of shapes as well as
+cloning turtles. The animation is
+controlled through update().
+"""
+
+from turtle import *
+
+def stop():
+ global running
+ running = False
+
+def main():
+ global running
+ clearscreen()
+ bgcolor("gray10")
+ tracer(False)
+ shape("triangle")
+ f = 0.793402
+ phi = 9.064678
+ s = 5
+ c = 1
+ # create compound shape
+ sh = Shape("compound")
+ for i in range(10):
+ shapesize(s)
+ p =get_shapepoly()
+ s *= f
+ c *= f
+ tilt(-phi)
+ sh.addcomponent(p, (c, 0.25, 1-c), "black")
+ register_shape("multitri", sh)
+ # create dancers
+ shapesize(1)
+ shape("multitri")
+ pu()
+ setpos(0, -200)
+ dancers = []
+ for i in range(180):
+ fd(7)
+ tilt(-4)
+ lt(2)
+ update()
+ if i % 12 == 0:
+ dancers.append(clone())
+ home()
+ # dance
+ running = True
+ onkeypress(stop)
+ listen()
+ cs = 1
+ while running:
+ ta = -4
+ for dancer in dancers:
+ dancer.fd(7)
+ dancer.lt(2)
+ dancer.tilt(ta)
+ ta = -4 if ta > 0 else 2
+ if cs < 180:
+ right(4)
+ shapesize(cs)
+ cs *= 1.005
+ update()
+ return "DONE!"
+
+if __name__=='__main__':
+ print(main())
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/sorting_animate.py b/rootfs/usr/lib/python3.8/turtledemo/sorting_animate.py
new file mode 100644
index 0000000..d25a0ab
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/sorting_animate.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python3
+"""
+
+ sorting_animation.py
+
+A minimal sorting algorithm animation:
+Sorts a shelf of 10 blocks using insertion
+sort, selection sort and quicksort.
+
+Shelfs are implemented using builtin lists.
+
+Blocks are turtles with shape "square", but
+stretched to rectangles by shapesize()
+ ---------------------------------------
+ To exit press space button
+ ---------------------------------------
+"""
+from turtle import *
+import random
+
+
+class Block(Turtle):
+
+ def __init__(self, size):
+ self.size = size
+ Turtle.__init__(self, shape="square", visible=False)
+ self.pu()
+ self.shapesize(size * 1.5, 1.5, 2) # square-->rectangle
+ self.fillcolor("black")
+ self.st()
+
+ def glow(self):
+ self.fillcolor("red")
+
+ def unglow(self):
+ self.fillcolor("black")
+
+ def __repr__(self):
+ return "Block size: {0}".format(self.size)
+
+
+class Shelf(list):
+
+ def __init__(self, y):
+ "create a shelf. y is y-position of first block"
+ self.y = y
+ self.x = -150
+
+ def push(self, d):
+ width, _, _ = d.shapesize()
+ # align blocks by the bottom edge
+ y_offset = width / 2 * 20
+ d.sety(self.y + y_offset)
+ d.setx(self.x + 34 * len(self))
+ self.append(d)
+
+ def _close_gap_from_i(self, i):
+ for b in self[i:]:
+ xpos, _ = b.pos()
+ b.setx(xpos - 34)
+
+ def _open_gap_from_i(self, i):
+ for b in self[i:]:
+ xpos, _ = b.pos()
+ b.setx(xpos + 34)
+
+ def pop(self, key):
+ b = list.pop(self, key)
+ b.glow()
+ b.sety(200)
+ self._close_gap_from_i(key)
+ return b
+
+ def insert(self, key, b):
+ self._open_gap_from_i(key)
+ list.insert(self, key, b)
+ b.setx(self.x + 34 * key)
+ width, _, _ = b.shapesize()
+ # align blocks by the bottom edge
+ y_offset = width / 2 * 20
+ b.sety(self.y + y_offset)
+ b.unglow()
+
+def isort(shelf):
+ length = len(shelf)
+ for i in range(1, length):
+ hole = i
+ while hole > 0 and shelf[i].size < shelf[hole - 1].size:
+ hole = hole - 1
+ shelf.insert(hole, shelf.pop(i))
+ return
+
+def ssort(shelf):
+ length = len(shelf)
+ for j in range(0, length - 1):
+ imin = j
+ for i in range(j + 1, length):
+ if shelf[i].size < shelf[imin].size:
+ imin = i
+ if imin != j:
+ shelf.insert(j, shelf.pop(imin))
+
+def partition(shelf, left, right, pivot_index):
+ pivot = shelf[pivot_index]
+ shelf.insert(right, shelf.pop(pivot_index))
+ store_index = left
+ for i in range(left, right): # range is non-inclusive of ending value
+ if shelf[i].size < pivot.size:
+ shelf.insert(store_index, shelf.pop(i))
+ store_index = store_index + 1
+ shelf.insert(store_index, shelf.pop(right)) # move pivot to correct position
+ return store_index
+
+def qsort(shelf, left, right):
+ if left < right:
+ pivot_index = left
+ pivot_new_index = partition(shelf, left, right, pivot_index)
+ qsort(shelf, left, pivot_new_index - 1)
+ qsort(shelf, pivot_new_index + 1, right)
+
+def randomize():
+ disable_keys()
+ clear()
+ target = list(range(10))
+ random.shuffle(target)
+ for i, t in enumerate(target):
+ for j in range(i, len(s)):
+ if s[j].size == t + 1:
+ s.insert(i, s.pop(j))
+ show_text(instructions1)
+ show_text(instructions2, line=1)
+ enable_keys()
+
+def show_text(text, line=0):
+ line = 20 * line
+ goto(0,-250 - line)
+ write(text, align="center", font=("Courier", 16, "bold"))
+
+def start_ssort():
+ disable_keys()
+ clear()
+ show_text("Selection Sort")
+ ssort(s)
+ clear()
+ show_text(instructions1)
+ show_text(instructions2, line=1)
+ enable_keys()
+
+def start_isort():
+ disable_keys()
+ clear()
+ show_text("Insertion Sort")
+ isort(s)
+ clear()
+ show_text(instructions1)
+ show_text(instructions2, line=1)
+ enable_keys()
+
+def start_qsort():
+ disable_keys()
+ clear()
+ show_text("Quicksort")
+ qsort(s, 0, len(s) - 1)
+ clear()
+ show_text(instructions1)
+ show_text(instructions2, line=1)
+ enable_keys()
+
+def init_shelf():
+ global s
+ s = Shelf(-200)
+ vals = (4, 2, 8, 9, 1, 5, 10, 3, 7, 6)
+ for i in vals:
+ s.push(Block(i))
+
+def disable_keys():
+ onkey(None, "s")
+ onkey(None, "i")
+ onkey(None, "q")
+ onkey(None, "r")
+
+def enable_keys():
+ onkey(start_isort, "i")
+ onkey(start_ssort, "s")
+ onkey(start_qsort, "q")
+ onkey(randomize, "r")
+ onkey(bye, "space")
+
+def main():
+ getscreen().clearscreen()
+ ht(); penup()
+ init_shelf()
+ show_text(instructions1)
+ show_text(instructions2, line=1)
+ enable_keys()
+ listen()
+ return "EVENTLOOP"
+
+instructions1 = "press i for insertion sort, s for selection sort, q for quicksort"
+instructions2 = "spacebar to quit, r to randomize"
+
+if __name__=="__main__":
+ msg = main()
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/tree.py b/rootfs/usr/lib/python3.8/turtledemo/tree.py
new file mode 100755
index 0000000..98a20da
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/tree.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_tree.py
+
+Displays a 'breadth-first-tree' - in contrast
+to the classical Logo tree drawing programs,
+which use a depth-first-algorithm.
+
+Uses:
+(1) a tree-generator, where the drawing is
+quasi the side-effect, whereas the generator
+always yields None.
+(2) Turtle-cloning: At each branching point
+the current pen is cloned. So in the end
+there are 1024 turtles.
+"""
+from turtle import Turtle, mainloop
+from time import perf_counter as clock
+
+def tree(plist, l, a, f):
+ """ plist is list of pens
+ l is length of branch
+ a is half of the angle between 2 branches
+ f is factor by which branch is shortened
+ from level to level."""
+ if l > 3:
+ lst = []
+ for p in plist:
+ p.forward(l)
+ q = p.clone()
+ p.left(a)
+ q.right(a)
+ lst.append(p)
+ lst.append(q)
+ for x in tree(lst, l*f, a, f):
+ yield None
+
+def maketree():
+ p = Turtle()
+ p.setundobuffer(None)
+ p.hideturtle()
+ p.speed(0)
+ p.getscreen().tracer(30,0)
+ p.left(90)
+ p.penup()
+ p.forward(-210)
+ p.pendown()
+ t = tree([p], 200, 65, 0.6375)
+ for x in t:
+ pass
+
+def main():
+ a=clock()
+ maketree()
+ b=clock()
+ return "done: %.2f sec." % (b-a)
+
+if __name__ == "__main__":
+ msg = main()
+ print(msg)
+ mainloop()
diff --git a/rootfs/usr/lib/python3.8/turtledemo/turtle.cfg b/rootfs/usr/lib/python3.8/turtledemo/turtle.cfg
new file mode 100644
index 0000000..bd89a74
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/turtle.cfg
@@ -0,0 +1,10 @@
+width = 800
+height = 600
+canvwidth = 1200
+canvheight = 900
+shape = arrow
+mode = standard
+resizemode = auto
+fillcolor = ""
+title = Python turtle graphics demo.
+
diff --git a/rootfs/usr/lib/python3.8/turtledemo/two_canvases.py b/rootfs/usr/lib/python3.8/turtledemo/two_canvases.py
new file mode 100755
index 0000000..f360258
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/two_canvases.py
@@ -0,0 +1,54 @@
+"""turtledemo.two_canvases
+
+Use TurtleScreen and RawTurtle to draw on two
+distinct canvases in a separate window. 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/rootfs/usr/lib/python3.8/turtledemo/yinyang.py b/rootfs/usr/lib/python3.8/turtledemo/yinyang.py
new file mode 100755
index 0000000..11d1f47
--- /dev/null
+++ b/rootfs/usr/lib/python3.8/turtledemo/yinyang.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_yinyang.py
+
+Another drawing suitable as a beginner's
+programming example.
+
+The small circles are drawn by the circle
+command.
+
+"""
+
+from turtle import *
+
+def yin(radius, color1, color2):
+ width(3)
+ color("black", color1)
+ begin_fill()
+ circle(radius/2., 180)
+ circle(radius, 180)
+ left(180)
+ circle(-radius/2., 180)
+ end_fill()
+ left(90)
+ up()
+ forward(radius*0.35)
+ right(90)
+ down()
+ color(color1, color2)
+ begin_fill()
+ circle(radius*0.15)
+ end_fill()
+ left(90)
+ up()
+ backward(radius*0.35)
+ down()
+ left(90)
+
+def main():
+ reset()
+ yin(200, "black", "white")
+ yin(200, "white", "black")
+ ht()
+ return "Done!"
+
+if __name__ == '__main__':
+ main()
+ mainloop()