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.
@@ -0,0 +1,3 @@
1
+ from .core import Screen, Turtle
2
+
3
+ __version__ = "1.0.0"
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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.3.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ turtleshell