Format: application/octet-stream
⬇ Download File (19.0 KB)
   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