fix
This commit is contained in:
14
.CondaPkg/env/Lib/turtledemo/__init__.py
vendored
14
.CondaPkg/env/Lib/turtledemo/__init__.py
vendored
@@ -1,14 +0,0 @@
|
||||
"""
|
||||
--------------------------------------
|
||||
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!
|
||||
"""
|
||||
402
.CondaPkg/env/Lib/turtledemo/__main__.py
vendored
402
.CondaPkg/env/Lib/turtledemo/__main__.py
vendored
@@ -1,402 +0,0 @@
|
||||
#!/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)
|
||||
if darwin: # Leave Mac button colors alone - #44254.
|
||||
self.start_btn = Button(root, text=" START ", font=btnfont,
|
||||
fg='#00cc22', command=self.startDemo)
|
||||
self.stop_btn = Button(root, text=" STOP ", font=btnfont,
|
||||
fg='#00cc22', command=self.stopIt)
|
||||
self.clear_btn = Button(root, text=" CLEAR ", font=btnfont,
|
||||
fg='#00cc22', command = self.clearCanvas)
|
||||
else:
|
||||
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):
|
||||
# t._Screen is a singleton class instantiated or retrieved
|
||||
# by calling Screen. Since tdemo canvas needs a different
|
||||
# configuration, we manually set class attributes before
|
||||
# calling Screen and manually call superclass init after.
|
||||
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 = screen = turtle.Screen()
|
||||
turtle.TurtleScreen.__init__(screen, canvas)
|
||||
turtle.RawTurtle.screens = [screen]
|
||||
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"):
|
||||
if darwin: # Leave Mac button colors alone - #44254.
|
||||
self.start_btn.config(state=start)
|
||||
self.stop_btn.config(state=stop)
|
||||
self.clear_btn.config(state=clear)
|
||||
else:
|
||||
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.canvas.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()
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
161
.CondaPkg/env/Lib/turtledemo/bytedesign.py
vendored
161
.CondaPkg/env/Lib/turtledemo/bytedesign.py
vendored
@@ -1,161 +0,0 @@
|
||||
#!/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()
|
||||
59
.CondaPkg/env/Lib/turtledemo/chaos.py
vendored
59
.CondaPkg/env/Lib/turtledemo/chaos.py
vendored
@@ -1,59 +0,0 @@
|
||||
# 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()
|
||||
131
.CondaPkg/env/Lib/turtledemo/clock.py
vendored
131
.CondaPkg/env/Lib/turtledemo/clock.py
vendored
@@ -1,131 +0,0 @@
|
||||
#!/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)
|
||||
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()
|
||||
58
.CondaPkg/env/Lib/turtledemo/colormixer.py
vendored
58
.CondaPkg/env/Lib/turtledemo/colormixer.py
vendored
@@ -1,58 +0,0 @@
|
||||
# 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()
|
||||
108
.CondaPkg/env/Lib/turtledemo/forest.py
vendored
108
.CondaPkg/env/Lib/turtledemo/forest.py
vendored
@@ -1,108 +0,0 @@
|
||||
#!/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()
|
||||
138
.CondaPkg/env/Lib/turtledemo/fractalcurves.py
vendored
138
.CondaPkg/env/Lib/turtledemo/fractalcurves.py
vendored
@@ -1,138 +0,0 @@
|
||||
#!/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()
|
||||
119
.CondaPkg/env/Lib/turtledemo/lindenmayer.py
vendored
119
.CondaPkg/env/Lib/turtledemo/lindenmayer.py
vendored
@@ -1,119 +0,0 @@
|
||||
#!/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()
|
||||
79
.CondaPkg/env/Lib/turtledemo/minimal_hanoi.py
vendored
79
.CondaPkg/env/Lib/turtledemo/minimal_hanoi.py
vendored
@@ -1,79 +0,0 @@
|
||||
#!/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()
|
||||
226
.CondaPkg/env/Lib/turtledemo/nim.py
vendored
226
.CondaPkg/env/Lib/turtledemo/nim.py
vendored
@@ -1,226 +0,0 @@
|
||||
""" 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()
|
||||
54
.CondaPkg/env/Lib/turtledemo/paint.py
vendored
54
.CondaPkg/env/Lib/turtledemo/paint.py
vendored
@@ -1,54 +0,0 @@
|
||||
#!/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()
|
||||
61
.CondaPkg/env/Lib/turtledemo/peace.py
vendored
61
.CondaPkg/env/Lib/turtledemo/peace.py
vendored
@@ -1,61 +0,0 @@
|
||||
#!/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()
|
||||
175
.CondaPkg/env/Lib/turtledemo/penrose.py
vendored
175
.CondaPkg/env/Lib/turtledemo/penrose.py
vendored
@@ -1,175 +0,0 @@
|
||||
#!/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()
|
||||
111
.CondaPkg/env/Lib/turtledemo/planet_and_moon.py
vendored
111
.CondaPkg/env/Lib/turtledemo/planet_and_moon.py
vendored
@@ -1,111 +0,0 @@
|
||||
#!/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()
|
||||
65
.CondaPkg/env/Lib/turtledemo/rosette.py
vendored
65
.CondaPkg/env/Lib/turtledemo/rosette.py
vendored
@@ -1,65 +0,0 @@
|
||||
""" 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()
|
||||
86
.CondaPkg/env/Lib/turtledemo/round_dance.py
vendored
86
.CondaPkg/env/Lib/turtledemo/round_dance.py
vendored
@@ -1,86 +0,0 @@
|
||||
""" 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()
|
||||
204
.CondaPkg/env/Lib/turtledemo/sorting_animate.py
vendored
204
.CondaPkg/env/Lib/turtledemo/sorting_animate.py
vendored
@@ -1,204 +0,0 @@
|
||||
#!/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()
|
||||
62
.CondaPkg/env/Lib/turtledemo/tree.py
vendored
62
.CondaPkg/env/Lib/turtledemo/tree.py
vendored
@@ -1,62 +0,0 @@
|
||||
#!/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()
|
||||
10
.CondaPkg/env/Lib/turtledemo/turtle.cfg
vendored
10
.CondaPkg/env/Lib/turtledemo/turtle.cfg
vendored
@@ -1,10 +0,0 @@
|
||||
width = 800
|
||||
height = 600
|
||||
canvwidth = 1200
|
||||
canvheight = 900
|
||||
shape = arrow
|
||||
mode = standard
|
||||
resizemode = auto
|
||||
fillcolor = ""
|
||||
title = Python turtle graphics demo.
|
||||
|
||||
54
.CondaPkg/env/Lib/turtledemo/two_canvases.py
vendored
54
.CondaPkg/env/Lib/turtledemo/two_canvases.py
vendored
@@ -1,54 +0,0 @@
|
||||
"""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
|
||||
49
.CondaPkg/env/Lib/turtledemo/yinyang.py
vendored
49
.CondaPkg/env/Lib/turtledemo/yinyang.py
vendored
@@ -1,49 +0,0 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user