Format: application/octet-stream
1 import sys
2 from typing import Any, Callable, Dict, List, Optional, Sequence, Text, Tuple, TypeVar, Union, overload
3
4 if sys.version_info >= (3,):
5 from tkinter import Canvas, PhotoImage
6 else:
7 # TODO: Replace these aliases once we have Python 2 stubs for the Tkinter module.
8 Canvas = Any
9 PhotoImage = Any
10
11 # Note: '_Color' is the alias we use for arguments and _AnyColor is the
12 # alias we use for return types. Really, these two aliases should be the
13 # same, but as per the "no union returns" typeshed policy, we'll return
14 # Any instead.
15 _Color = Union[Text, Tuple[float, float, float]]
16 _AnyColor = Any
17
18 # TODO: Replace this with a TypedDict once it becomes standardized.
19 _PenState = Dict[str, Any]
20
21 _Speed = Union[str, float]
22 _PolygonCoords = Sequence[Tuple[float, float]]
23
24 # TODO: Type this more accurately
25 # Vec2D is actually a custom subclass of 'tuple'.
26 Vec2D = Tuple[float, float]
27
28 class TurtleScreenBase(object):
29 cv: Canvas = ...
30 canvwidth: int = ...
31 canvheight: int = ...
32 xscale: float = ...
33 yscale: float = ...
34 def __init__(self, cv: Canvas) -> None: ...
35 if sys.version_info >= (3,):
36 def mainloop(self) -> None: ...
37 def textinput(self, title: str, prompt: str) -> Optional[str]: ...
38 def numinput(
39 self,
40 title: str,
41 prompt: str,
42 default: Optional[float] = ...,
43 minval: Optional[float] = ...,
44 maxval: Optional[float] = ...,
45 ) -> Optional[float]: ...
46
47 class Terminator(Exception): ...
48 class TurtleGraphicsError(Exception): ...
49
50 class Shape(object):
51 def __init__(self, type_: str, data: Union[_PolygonCoords, PhotoImage, None] = ...) -> None: ...
52 def addcomponent(self, poly: _PolygonCoords, fill: _Color, outline: Optional[_Color] = ...) -> None: ...
53
54 class TurtleScreen(TurtleScreenBase):
55 def __init__(self, cv: Canvas, mode: str = ..., colormode: float = ..., delay: int = ...) -> None: ...
56 def clear(self) -> None: ...
57 @overload
58 def mode(self, mode: None = ...) -> str: ...
59 @overload
60 def mode(self, mode: str) -> None: ...
61 def setworldcoordinates(self, llx: float, lly: float, urx: float, ury: float) -> None: ...
62 def register_shape(self, name: str, shape: Union[_PolygonCoords, Shape, None] = ...) -> None: ...
63 @overload
64 def colormode(self, cmode: None = ...) -> float: ...
65 @overload
66 def colormode(self, cmode: float) -> None: ...
67 def reset(self) -> None: ...
68 def turtles(self) -> List[Turtle]: ...
69 @overload
70 def bgcolor(self) -> _AnyColor: ...
71 @overload
72 def bgcolor(self, color: _Color) -> None: ...
73 @overload
74 def bgcolor(self, r: float, g: float, b: float) -> None: ...
75 @overload
76 def tracer(self, n: None = ...) -> int: ...
77 @overload
78 def tracer(self, n: int, delay: Optional[int] = ...) -> None: ...
79 @overload
80 def delay(self, delay: None = ...) -> int: ...
81 @overload
82 def delay(self, delay: int) -> None: ...
83 def update(self) -> None: ...
84 def window_width(self) -> int: ...
85 def window_height(self) -> int: ...
86 def getcanvas(self) -> Canvas: ...
87 def getshapes(self) -> List[str]: ...
88 def onclick(self, fun: Callable[[float, float], Any], btn: int = ..., add: Optional[Any] = ...) -> None: ...
89 def onkey(self, fun: Callable[[], Any], key: str) -> None: ...
90 def listen(self, xdummy: Optional[float] = ..., ydummy: Optional[float] = ...) -> None: ...
91 def ontimer(self, fun: Callable[[], Any], t: int = ...) -> None: ...
92 @overload
93 def bgpic(self, picname: None = ...) -> str: ...
94 @overload
95 def bgpic(self, picname: str) -> None: ...
96 @overload
97 def screensize(self, canvwidth: None = ..., canvheight: None = ..., bg: None = ...) -> Tuple[int, int]: ...
98 # Looks like if self.cv is not a ScrolledCanvas, this could return a tuple as well
99 @overload
100 def screensize(self, canvwidth: int, canvheight: int, bg: Optional[_Color] = ...) -> None: ...
101 onscreenclick = onclick
102 resetscreen = reset
103 clearscreen = clear
104 addshape = register_shape
105 if sys.version_info >= (3,):
106 def onkeypress(self, fun: Callable[[], Any], key: Optional[str] = ...) -> None: ...
107 onkeyrelease = onkey
108
109 class TNavigator(object):
110 START_ORIENTATION: Dict[str, Vec2D] = ...
111 DEFAULT_MODE: str = ...
112 DEFAULT_ANGLEOFFSET: int = ...
113 DEFAULT_ANGLEORIENT: int = ...
114 def __init__(self, mode: str = ...) -> None: ...
115 def reset(self) -> None: ...
116 def degrees(self, fullcircle: float = ...) -> None: ...
117 def radians(self) -> None: ...
118 def forward(self, distance: float) -> None: ...
119 def back(self, distance: float) -> None: ...
120 def right(self, angle: float) -> None: ...
121 def left(self, angle: float) -> None: ...
122 def pos(self) -> Vec2D: ...
123 def xcor(self) -> float: ...
124 def ycor(self) -> float: ...
125 @overload
126 def goto(self, x: Tuple[float, float], y: None = ...) -> None: ...
127 @overload
128 def goto(self, x: float, y: float) -> None: ...
129 def home(self) -> None: ...
130 def setx(self, x: float) -> None: ...
131 def sety(self, y: float) -> None: ...
132 @overload
133 def distance(self, x: Union[TNavigator, Tuple[float, float]], y: None = ...) -> float: ...
134 @overload
135 def distance(self, x: float, y: float) -> float: ...
136 @overload
137 def towards(self, x: Union[TNavigator, Tuple[float, float]], y: None = ...) -> float: ...
138 @overload
139 def towards(self, x: float, y: float) -> float: ...
140 def heading(self) -> float: ...
141 def setheading(self, to_angle: float) -> None: ...
142 def circle(self, radius: float, extent: Optional[float] = ..., steps: Optional[int] = ...) -> None: ...
143 fd = forward
144 bk = back
145 backward = back
146 rt = right
147 lt = left
148 position = pos
149 setpos = goto
150 setposition = goto
151 seth = setheading
152
153 class TPen(object):
154 def __init__(self, resizemode: str = ...) -> None: ...
155 @overload
156 def resizemode(self, rmode: None = ...) -> str: ...
157 @overload
158 def resizemode(self, rmode: str) -> None: ...
159 @overload
160 def pensize(self, width: None = ...) -> int: ...
161 @overload
162 def pensize(self, width: int) -> None: ...
163 def penup(self) -> None: ...
164 def pendown(self) -> None: ...
165 def isdown(self) -> bool: ...
166 @overload
167 def speed(self, speed: None = ...) -> int: ...
168 @overload
169 def speed(self, speed: _Speed) -> None: ...
170 @overload
171 def pencolor(self) -> _AnyColor: ...
172 @overload
173 def pencolor(self, color: _Color) -> None: ...
174 @overload
175 def pencolor(self, r: float, g: float, b: float) -> None: ...
176 @overload
177 def fillcolor(self) -> _AnyColor: ...
178 @overload
179 def fillcolor(self, color: _Color) -> None: ...
180 @overload
181 def fillcolor(self, r: float, g: float, b: float) -> None: ...
182 @overload
183 def color(self) -> Tuple[_AnyColor, _AnyColor]: ...
184 @overload
185 def color(self, color: _Color) -> None: ...
186 @overload
187 def color(self, r: float, g: float, b: float) -> None: ...
188 @overload
189 def color(self, color1: _Color, color2: _Color) -> None: ...
190 def showturtle(self) -> None: ...
191 def hideturtle(self) -> None: ...
192 def isvisible(self) -> bool: ...
193 # Note: signatures 1 and 2 overlap unsafely when no arguments are provided
194 @overload
195 def pen(self) -> _PenState: ... # type: ignore
196 @overload
197 def pen(
198 self,
199 pen: Optional[_PenState] = ...,
200 *,
201 shown: bool = ...,
202 pendown: bool = ...,
203 pencolor: _Color = ...,
204 fillcolor: _Color = ...,
205 pensize: int = ...,
206 speed: int = ...,
207 resizemode: str = ...,
208 stretchfactor: Tuple[float, float] = ...,
209 outline: int = ...,
210 tilt: float = ...,
211 ) -> None: ...
212 width = pensize
213 up = penup
214 pu = penup
215 pd = pendown
216 down = pendown
217 st = showturtle
218 ht = hideturtle
219
220 _T = TypeVar("_T")
221
222 class RawTurtle(TPen, TNavigator):
223 def __init__(
224 self, canvas: Union[Canvas, TurtleScreen, None] = ..., shape: str = ..., undobuffersize: int = ..., visible: bool = ...
225 ) -> None: ...
226 def reset(self) -> None: ...
227 def setundobuffer(self, size: Optional[int]) -> None: ...
228 def undobufferentries(self) -> int: ...
229 def clear(self) -> None: ...
230 def clone(self: _T) -> _T: ...
231 @overload
232 def shape(self, name: None = ...) -> str: ...
233 @overload
234 def shape(self, name: str) -> None: ...
235 # Unsafely overlaps when no arguments are provided
236 @overload
237 def shapesize(self) -> Tuple[float, float, float]: ... # type: ignore
238 @overload
239 def shapesize(
240 self, stretch_wid: Optional[float] = ..., stretch_len: Optional[float] = ..., outline: Optional[float] = ...
241 ) -> None: ...
242 if sys.version_info >= (3,):
243 @overload
244 def shearfactor(self, shear: None = ...) -> float: ...
245 @overload
246 def shearfactor(self, shear: float) -> None: ...
247 # Unsafely overlaps when no arguments are provided
248 @overload
249 def shapetransform(self) -> Tuple[float, float, float, float]: ... # type: ignore
250 @overload
251 def shapetransform(
252 self, t11: Optional[float] = ..., t12: Optional[float] = ..., t21: Optional[float] = ..., t22: Optional[float] = ...
253 ) -> None: ...
254 def get_shapepoly(self) -> Optional[_PolygonCoords]: ...
255 def settiltangle(self, angle: float) -> None: ...
256 @overload
257 def tiltangle(self, angle: None = ...) -> float: ...
258 @overload
259 def tiltangle(self, angle: float) -> None: ...
260 def tilt(self, angle: float) -> None: ...
261 # Can return either 'int' or Tuple[int, ...] based on if the stamp is
262 # a compound stamp or not. So, as per the "no Union return" policy,
263 # we return Any.
264 def stamp(self) -> Any: ...
265 def clearstamp(self, stampid: Union[int, Tuple[int, ...]]) -> None: ...
266 def clearstamps(self, n: Optional[int] = ...) -> None: ...
267 def filling(self) -> bool: ...
268 def begin_fill(self) -> None: ...
269 def end_fill(self) -> None: ...
270 def dot(self, size: Optional[int] = ..., *color: _Color) -> None: ...
271 def write(self, arg: object, move: bool = ..., align: str = ..., font: Tuple[str, int, str] = ...) -> None: ...
272 def begin_poly(self) -> None: ...
273 def end_poly(self) -> None: ...
274 def get_poly(self) -> Optional[_PolygonCoords]: ...
275 def getscreen(self) -> TurtleScreen: ...
276 def getturtle(self: _T) -> _T: ...
277 getpen = getturtle
278 def onclick(self, fun: Callable[[float, float], Any], btn: int = ..., add: Optional[bool] = ...) -> None: ...
279 def onrelease(self, fun: Callable[[float, float], Any], btn: int = ..., add: Optional[bool] = ...) -> None: ...
280 def ondrag(self, fun: Callable[[float, float], Any], btn: int = ..., add: Optional[bool] = ...) -> None: ...
281 def undo(self) -> None: ...
282 turtlesize = shapesize
283
284 class _Screen(TurtleScreen):
285 def __init__(self) -> None: ...
286 # Note int and float are interpreted differently, hence the Union instead of just float
287 def setup(
288 self,
289 width: Union[int, float] = ...,
290 height: Union[int, float] = ...,
291 startx: Optional[int] = ...,
292 starty: Optional[int] = ...,
293 ) -> None: ...
294 def title(self, titlestring: str) -> None: ...
295 def bye(self) -> None: ...
296 def exitonclick(self) -> None: ...
297
298 def Screen() -> _Screen: ...
299
300 class Turtle(RawTurtle):
301 def __init__(self, shape: str = ..., undobuffersize: int = ..., visible: bool = ...) -> None: ...
302
303 RawPen = RawTurtle
304 Pen = Turtle
305
306 def write_docstringdict(filename: str = ...) -> None: ...
307
308 # Note: it's somewhat unfortunate that we have to copy the function signatures.
309 # It would be nice if we could partially reduce the redundancy by doing something
310 # like the following:
311 #
312 # _screen: Screen
313 # clear = _screen.clear
314 #
315 # However, it seems pytype does not support this type of syntax in pyi files.
316
317 # Functions copied from TurtleScreenBase:
318
319 # Note: mainloop() was always present in the global scope, but was added to
320 # TurtleScreenBase in Python 3.0
321 def mainloop() -> None: ...
322
323 if sys.version_info >= (3,):
324 def textinput(title: str, prompt: str) -> Optional[str]: ...
325 def numinput(
326 title: str, prompt: str, default: Optional[float] = ..., minval: Optional[float] = ..., maxval: Optional[float] = ...
327 ) -> Optional[float]: ...
328
329 # Functions copied from TurtleScreen:
330
331 def clear() -> None: ...
332 @overload
333 def mode(mode: None = ...) -> str: ...
334 @overload
335 def mode(mode: str) -> None: ...
336 def setworldcoordinates(llx: float, lly: float, urx: float, ury: float) -> None: ...
337 def register_shape(name: str, shape: Union[_PolygonCoords, Shape, None] = ...) -> None: ...
338 @overload
339 def colormode(cmode: None = ...) -> float: ...
340 @overload
341 def colormode(cmode: float) -> None: ...
342 def reset() -> None: ...
343 def turtles() -> List[Turtle]: ...
344 @overload
345 def bgcolor() -> _AnyColor: ...
346 @overload
347 def bgcolor(color: _Color) -> None: ...
348 @overload
349 def bgcolor(r: float, g: float, b: float) -> None: ...
350 @overload
351 def tracer(n: None = ...) -> int: ...
352 @overload
353 def tracer(n: int, delay: Optional[int] = ...) -> None: ...
354 @overload
355 def delay(delay: None = ...) -> int: ...
356 @overload
357 def delay(delay: int) -> None: ...
358 def update() -> None: ...
359 def window_width() -> int: ...
360 def window_height() -> int: ...
361 def getcanvas() -> Canvas: ...
362 def getshapes() -> List[str]: ...
363 def onclick(fun: Callable[[float, float], Any], btn: int = ..., add: Optional[Any] = ...) -> None: ...
364 def onkey(fun: Callable[[], Any], key: str) -> None: ...
365 def listen(xdummy: Optional[float] = ..., ydummy: Optional[float] = ...) -> None: ...
366 def ontimer(fun: Callable[[], Any], t: int = ...) -> None: ...
367 @overload
368 def bgpic(picname: None = ...) -> str: ...
369 @overload
370 def bgpic(picname: str) -> None: ...
371 @overload
372 def screensize(canvwidth: None = ..., canvheight: None = ..., bg: None = ...) -> Tuple[int, int]: ...
373 @overload
374 def screensize(canvwidth: int, canvheight: int, bg: Optional[_Color] = ...) -> None: ...
375
376 onscreenclick = onclick
377 resetscreen = reset
378 clearscreen = clear
379 addshape = register_shape
380 if sys.version_info >= (3,):
381 def onkeypress(fun: Callable[[], Any], key: Optional[str] = ...) -> None: ...
382 onkeyrelease = onkey
383
384 # Functions copied from TNavigator:
385
386 def degrees(fullcircle: float = ...) -> None: ...
387 def radians() -> None: ...
388 def forward(distance: float) -> None: ...
389 def back(distance: float) -> None: ...
390 def right(angle: float) -> None: ...
391 def left(angle: float) -> None: ...
392 def pos() -> Vec2D: ...
393 def xcor() -> float: ...
394 def ycor() -> float: ...
395 @overload
396 def goto(x: Tuple[float, float], y: None = ...) -> None: ...
397 @overload
398 def goto(x: float, y: float) -> None: ...
399 def home() -> None: ...
400 def setx(x: float) -> None: ...
401 def sety(y: float) -> None: ...
402 @overload
403 def distance(x: Union[TNavigator, Tuple[float, float]], y: None = ...) -> float: ...
404 @overload
405 def distance(x: float, y: float) -> float: ...
406 @overload
407 def towards(x: Union[TNavigator, Tuple[float, float]], y: None = ...) -> float: ...
408 @overload
409 def towards(x: float, y: float) -> float: ...
410 def heading() -> float: ...
411 def setheading(to_angle: float) -> None: ...
412 def circle(radius: float, extent: Optional[float] = ..., steps: Optional[int] = ...) -> None: ...
413
414 fd = forward
415 bk = back
416 backward = back
417 rt = right
418 lt = left
419 position = pos
420 setpos = goto
421 setposition = goto
422 seth = setheading
423
424 # Functions copied from TPen:
425 @overload
426 def resizemode(rmode: None = ...) -> str: ...
427 @overload
428 def resizemode(rmode: str) -> None: ...
429 @overload
430 def pensize(width: None = ...) -> int: ...
431 @overload
432 def pensize(width: int) -> None: ...
433 def penup() -> None: ...
434 def pendown() -> None: ...
435 def isdown() -> bool: ...
436 @overload
437 def speed(speed: None = ...) -> int: ...
438 @overload
439 def speed(speed: _Speed) -> None: ...
440 @overload
441 def pencolor() -> _AnyColor: ...
442 @overload
443 def pencolor(color: _Color) -> None: ...
444 @overload
445 def pencolor(r: float, g: float, b: float) -> None: ...
446 @overload
447 def fillcolor() -> _AnyColor: ...
448 @overload
449 def fillcolor(color: _Color) -> None: ...
450 @overload
451 def fillcolor(r: float, g: float, b: float) -> None: ...
452 @overload
453 def color() -> Tuple[_AnyColor, _AnyColor]: ...
454 @overload
455 def color(color: _Color) -> None: ...
456 @overload
457 def color(r: float, g: float, b: float) -> None: ...
458 @overload
459 def color(color1: _Color, color2: _Color) -> None: ...
460 def showturtle() -> None: ...
461 def hideturtle() -> None: ...
462 def isvisible() -> bool: ...
463
464 # Note: signatures 1 and 2 overlap unsafely when no arguments are provided
465 @overload
466 def pen() -> _PenState: ... # type: ignore
467 @overload
468 def pen(
469 pen: Optional[_PenState] = ...,
470 *,
471 shown: bool = ...,
472 pendown: bool = ...,
473 pencolor: _Color = ...,
474 fillcolor: _Color = ...,
475 pensize: int = ...,
476 speed: int = ...,
477 resizemode: str = ...,
478 stretchfactor: Tuple[float, float] = ...,
479 outline: int = ...,
480 tilt: float = ...,
481 ) -> None: ...
482
483 width = pensize
484 up = penup
485 pu = penup
486 pd = pendown
487 down = pendown
488 st = showturtle
489 ht = hideturtle
490
491 # Functions copied from RawTurtle:
492
493 def setundobuffer(size: Optional[int]) -> None: ...
494 def undobufferentries() -> int: ...
495 @overload
496 def shape(name: None = ...) -> str: ...
497 @overload
498 def shape(name: str) -> None: ...
499
500 # Unsafely overlaps when no arguments are provided
501 @overload
502 def shapesize() -> Tuple[float, float, float]: ... # type: ignore
503 @overload
504 def shapesize(stretch_wid: Optional[float] = ..., stretch_len: Optional[float] = ..., outline: Optional[float] = ...) -> None: ...
505
506 if sys.version_info >= (3,):
507 @overload
508 def shearfactor(shear: None = ...) -> float: ...
509 @overload
510 def shearfactor(shear: float) -> None: ...
511 # Unsafely overlaps when no arguments are provided
512 @overload
513 def shapetransform() -> Tuple[float, float, float, float]: ... # type: ignore
514 @overload
515 def shapetransform(
516 t11: Optional[float] = ..., t12: Optional[float] = ..., t21: Optional[float] = ..., t22: Optional[float] = ...
517 ) -> None: ...
518 def get_shapepoly() -> Optional[_PolygonCoords]: ...
519
520 def settiltangle(angle: float) -> None: ...
521 @overload
522 def tiltangle(angle: None = ...) -> float: ...
523 @overload
524 def tiltangle(angle: float) -> None: ...
525 def tilt(angle: float) -> None: ...
526
527 # Can return either 'int' or Tuple[int, ...] based on if the stamp is
528 # a compound stamp or not. So, as per the "no Union return" policy,
529 # we return Any.
530 def stamp() -> Any: ...
531 def clearstamp(stampid: Union[int, Tuple[int, ...]]) -> None: ...
532 def clearstamps(n: Optional[int] = ...) -> None: ...
533 def filling() -> bool: ...
534 def begin_fill() -> None: ...
535 def end_fill() -> None: ...
536 def dot(size: Optional[int] = ..., *color: _Color) -> None: ...
537 def write(arg: object, move: bool = ..., align: str = ..., font: Tuple[str, int, str] = ...) -> None: ...
538 def begin_poly() -> None: ...
539 def end_poly() -> None: ...
540 def get_poly() -> Optional[_PolygonCoords]: ...
541 def getscreen() -> TurtleScreen: ...
542 def getturtle() -> Turtle: ...
543
544 getpen = getturtle
545
546 def onrelease(fun: Callable[[float, float], Any], btn: int = ..., add: Optional[Any] = ...) -> None: ...
547 def ondrag(fun: Callable[[float, float], Any], btn: int = ..., add: Optional[Any] = ...) -> None: ...
548 def undo() -> None: ...
549
550 turtlesize = shapesize
551
552 # Functions copied from RawTurtle with a few tweaks:
553
554 def clone() -> Turtle: ...
555
556 # Extra functions present only in the global scope:
557
558 done = mainloop
559