turtleshell 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
turtleshell/__init__.py
ADDED
turtleshell/core.py
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
"""Convenience wrappers around turtle.Turtle and turtle.Screen
|
2
|
+
See https://github.com/python/cpython/blob/main/Lib/turtle.py
|
3
|
+
"""
|
4
|
+
#TODO handle floats, randcoords, default screensize, default shape
|
5
|
+
|
6
|
+
import colorsys
|
7
|
+
from dataclasses import dataclass
|
8
|
+
import turtle
|
9
|
+
|
10
|
+
@dataclass
|
11
|
+
class HSV:
|
12
|
+
hue: float
|
13
|
+
sat: float
|
14
|
+
val: float
|
15
|
+
def __iter__(self):
|
16
|
+
return iter(self.__dict__.values())
|
17
|
+
|
18
|
+
def Screen():
|
19
|
+
"""Return the singleton screen object."""
|
20
|
+
if Turtle._screen is None:
|
21
|
+
Turtle._screen = _Screen()
|
22
|
+
return Turtle._screen
|
23
|
+
|
24
|
+
class _Screen(turtle._Screen):
|
25
|
+
def __init__(self):
|
26
|
+
super().__init__()
|
27
|
+
turtle.TurtleScreen.__init__(self, _Screen._canvas)
|
28
|
+
if turtle.Turtle._screen is None:
|
29
|
+
turtle.Turtle._screen = self
|
30
|
+
self.colormode(255)
|
31
|
+
|
32
|
+
def _colorstr(self, color):
|
33
|
+
isnumber = lambda x: isinstance(x, (int, float))
|
34
|
+
if len(color) == 3 and all([isnumber(c) for c in color]):
|
35
|
+
lower, upper = 0, Turtle._screen.colormode()
|
36
|
+
color = [max(min(upper, round(c)), lower) for c in color]
|
37
|
+
return super()._colorstr(color)
|
38
|
+
|
39
|
+
def _hsv_to_rgb(hsv):
|
40
|
+
rgb = colorsys.hsv_to_rgb(*hsv)
|
41
|
+
return [round(c*Turtle._screen.colormode()) for c in rgb]
|
42
|
+
|
43
|
+
class Turtle(turtle.RawTurtle):
|
44
|
+
|
45
|
+
_pen = None
|
46
|
+
_screen = None
|
47
|
+
|
48
|
+
def __init__(self,
|
49
|
+
shape=turtle._CFG["shape"],
|
50
|
+
undobuffersize=turtle._CFG["undobuffersize"],
|
51
|
+
visible=turtle._CFG["visible"]):
|
52
|
+
if Turtle._screen is None:
|
53
|
+
Turtle._screen = Screen()
|
54
|
+
turtle.RawTurtle.__init__(self, Turtle._screen,
|
55
|
+
shape=shape,
|
56
|
+
undobuffersize=undobuffersize,
|
57
|
+
visible=visible)
|
58
|
+
self.shapesize(20)
|
59
|
+
self._pen_hsv = HSV(0, 1, 1)
|
60
|
+
self._fill_hsv = HSV(0, 1, 1)
|
61
|
+
|
62
|
+
@property
|
63
|
+
def x(self):
|
64
|
+
return self.xcor()
|
65
|
+
|
66
|
+
@x.setter
|
67
|
+
def x(self, value):
|
68
|
+
self.setx(value)
|
69
|
+
|
70
|
+
@property
|
71
|
+
def y(self):
|
72
|
+
return self.ycor()
|
73
|
+
|
74
|
+
@y.setter
|
75
|
+
def y(self, value):
|
76
|
+
self.sety(value)
|
77
|
+
|
78
|
+
@property
|
79
|
+
def shapewidth(self):
|
80
|
+
xcoords = [vertex[0] for vertex in self.get_shapepoly()]
|
81
|
+
return max(xcoords) - min(xcoords)
|
82
|
+
|
83
|
+
@property
|
84
|
+
def shapeheight(self):
|
85
|
+
ycoords = [vertex[1] for vertex in self.get_shapepoly()]
|
86
|
+
return max(ycoords) - min(ycoords)
|
87
|
+
|
88
|
+
def hue(self, degrees):
|
89
|
+
self.penhue(degrees)
|
90
|
+
self.fillhue(degrees)
|
91
|
+
|
92
|
+
def penhue(self, degrees):
|
93
|
+
self._pen_hsv.hue = degrees/360
|
94
|
+
self.pencolor(_hsv_to_rgb(self._pen_hsv))
|
95
|
+
|
96
|
+
def fillhue(self, degrees):
|
97
|
+
self._fill_hsv.hue = degrees/360
|
98
|
+
self.fillcolor(_hsv_to_rgb(self._fill_hsv))
|
99
|
+
|
100
|
+
def sat(self, value):
|
101
|
+
self.pensat(value)
|
102
|
+
self.fillsat(value)
|
103
|
+
|
104
|
+
def pensat(self, value):
|
105
|
+
self._pen_hsv.sat = value/100
|
106
|
+
self.pencolor(_hsv_to_rgb(self._pen_hsv))
|
107
|
+
|
108
|
+
def fillsat(self, value):
|
109
|
+
self._fill_hsv.sat = value/100
|
110
|
+
self.fillcolor(_hsv_to_rgb(self._fill_hsv))
|
111
|
+
|
112
|
+
def val(self, value):
|
113
|
+
self.penval(value)
|
114
|
+
self.fillval(value)
|
115
|
+
|
116
|
+
def penval(self, value):
|
117
|
+
self._pen_hsv.val = value/100
|
118
|
+
self.pencolor(_hsv_to_rgb(self._pen_hsv))
|
119
|
+
|
120
|
+
def fillval(self, value):
|
121
|
+
self._fill_hsv.val = value/100
|
122
|
+
self.fillcolor(_hsv_to_rgb(self._fill_hsv))
|
123
|
+
|
124
|
+
def shapesize(self, stretch_wid=None, stretch_len=None, outline=None):
|
125
|
+
stretch_wid = stretch_wid/20 if stretch_wid else None
|
126
|
+
stretch_len = stretch_len/20 if stretch_len else None
|
127
|
+
super().shapesize(stretch_wid, stretch_len, outline)
|
128
|
+
|
129
|
+
def teleport(self, x, y):
|
130
|
+
pendown = self.isdown()
|
131
|
+
if pendown:
|
132
|
+
self.pen(pendown=False)
|
133
|
+
self.penup()
|
134
|
+
self._position = turtle.Vec2D(x, y)
|
135
|
+
self.pen(pendown=pendown)
|
136
|
+
|
137
|
+
def write(self, arg, move=False, align="center", font=("Arial", 18, "bold")):
|
138
|
+
super().write(arg, move, align, font)
|
139
|
+
|
140
|
+
Pen = Turtle
|
141
|
+
|
142
|
+
if __name__ == "__main__":
|
143
|
+
canvas = Screen()
|
144
|
+
canvas.bgcolor("gold")
|
145
|
+
pen = Turtle()
|
146
|
+
print(f"\n\n***\nTURTLE TYPE: {type(pen)}\nSCREEN TYPE: {type(canvas)}\n***\n")
|
147
|
+
|
148
|
+
pen.shape("square")
|
149
|
+
print(f"{pen.shapewidth}, {pen.shapeheight}")
|
150
|
+
pen.shapesize(30, 25)
|
151
|
+
print(f"{pen.shapewidth}, {pen.shapeheight}")
|
152
|
+
|
153
|
+
pen.hue(0)
|
154
|
+
pen.stamp()
|
155
|
+
pen.forward(50)
|
156
|
+
pen.hue(60)
|
157
|
+
pen.stamp()
|
158
|
+
pen.forward(50)
|
159
|
+
pen.hue(120)
|
160
|
+
pen.stamp()
|
161
|
+
pen.forward(50)
|
162
|
+
pen.hue(180)
|
163
|
+
pen.stamp()
|
164
|
+
pen.forward(50)
|
165
|
+
pen.hue(240)
|
166
|
+
pen.stamp()
|
167
|
+
|
168
|
+
canvas.exitonclick()
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: turtleshell
|
3
|
+
Version: 1.0.0
|
4
|
+
Summary: Convenience wrapper around turtle.Turtle and turtle.Screen
|
5
|
+
Author-email: Sam Mangan <sam.mangan2@gmail.com>
|
6
|
+
License-Expression: MIT
|
7
|
+
Project-URL: Homepage, https://github.com/SamMangan/turtleshell
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
9
|
+
Classifier: Operating System :: OS Independent
|
10
|
+
Requires-Python: >=3.9
|
11
|
+
Description-Content-Type: text/markdown
|
12
|
+
Provides-Extra: dev
|
13
|
+
Requires-Dist: bumpver; extra == "dev"
|
14
|
+
Requires-Dist: pytest; extra == "dev"
|
15
|
+
|
16
|
+
# TurtleShell
|
17
|
+
|
18
|
+
Convenience wrapper around Python turtle standard library.
|
@@ -0,0 +1,6 @@
|
|
1
|
+
turtleshell/__init__.py,sha256=h6t_4SE0atKJUhhgKKa_b-sPBTxZss4hnR-EnqRIixU,55
|
2
|
+
turtleshell/core.py,sha256=6MXthwzvQmFWqnGJKijjn1olIzG_jS8WyGcMoXH1i1A,4437
|
3
|
+
turtleshell-1.0.0.dist-info/METADATA,sha256=OOy35r3xo3pqEC-JNtB1z_wEmKaePxOf4fHjWxABPBA,590
|
4
|
+
turtleshell-1.0.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
|
5
|
+
turtleshell-1.0.0.dist-info/top_level.txt,sha256=nIp6ZtgikYbeYxpXq6zs04zeIaXIMs3ZzAx5QREfkYM,12
|
6
|
+
turtleshell-1.0.0.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
turtleshell
|