{ "info": { "author": "Repl.it", "author_email": "gchiacchieri@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7" ], "description": "# Python Play (beta)\n\n[![Try on repl.it](https://repl-badge.jajoosam.repl.co/try.png)](https://repl.it/@glench/Python-Play-sample-game)\n\n## The easiest way to start coding games and graphics projects in Python\n\nPython Play is an open-source code library for the Python programming language that makes it as easy as possible to start making games. Here's the code to make a simple game using Play:\n\n```python\nimport play\n\ncat = play.new_text('=^.^=', font_size=70)\n\n@play.repeat_forever\nasync def move_cat():\n cat.x = play.random_number(-200, 200)\n cat.y = play.random_number(-200, 200)\n cat.color = play.random_color()\n\n cat.show()\n\n await play.timer(seconds=0.4)\n\n cat.hide()\n\n await play.timer(seconds=0.4)\n\n@cat.when_clicked\ndef win_function():\n cat.show()\n cat.words = 'You won!'\n\nplay.start_program()\n```\n\nThe code above makes a game where you have to click the cat to win:\n\n![Clicking a cat game](example.gif)\n\n**[You can try playing and changing this game on repl.it!](https://repl.it/@glench/Python-Play-sample-game)**\n\nPython Play is an excellent choice for beginner programmers to get started with graphics programming. It was designed to have similar commands and simplicity to [MIT's Scratch](https://scratch.mit.edu) and is distinguished from such projects as Pygame, Arcade, or Pygame Zero because of its lack of boiler plate code, its easy-to-understand plain-english commands, and intuitive API. [Read more about its design at the bottom of this document](#why-use-python-play).\n\n# How to install Python Play\n\nRun the following command in your terminal:\n\n pip install replit-play\n\nOr you can just go to [repl.it](https://repl.it/@glench/Python-Play-sample-game) and you won't have to install anything :)\n\n# How to use Python Play\n\nAll Python Play programs start with `import play` and end with `play.start_program()`, like this:\n\n```python\nimport play # this is the first line in the program\n\n\n\nplay.start_program() # this is the last line in the program\n```\n\nAll other commands go between those two commands.\n\nTo try any of the following examples, go to **[repl.it and try pasting code in](https://repl.it/@glench/Replit-Play-Template)**.\n\n## Commands\n\nThe rest of this document is divided into the following sections:\n\n- [Basic Commands](#basic-commands) - Getting graphics, shapes, and text on the screen. Also changing the backdrop.\n- [Animation and Control Commands](#animation-and-control-commands) - Animating and controlling graphics, shapes, and text.\n- [Sprite Commands](#sprite-commands) - Controlling sprites.\n- [Mouse Commands](#mouse-commands) - Detecting mouse actions (clicks, movement).\n- [Keyboard Commands](#keyboard-commands) - Detecting keyboard actions.\n- [Physics Commands](#physics-commands) - Making physics objects.\n- [Other Useful Commands](#other-useful-commands) - General commands.\n- [Why use Python Play?](#why-use-python-play) - How this library is different from other graphics libraries.\n\n## Basic Commands\n\nTo get images or text on the screen, use the following commands. (Copy and paste the code below to try it out.)\n\n#### `play.new_box()`\n```python\nbox = play.new_box(color='black', x=0, y=0, width=100, height=200, border_color=\"light blue\", border_width=0)\n```\n\nThis will put a tall, black box in the middle of the screen.\n\nIf you want to change where the image is on the screen, try changing `x=0` (horizontal position) and `y=0` (vertical position). Positive x is to the right and positive y is up. You can also change the color by changing `'black'` to another color name, like `'orange'`.\n\n\n#### `play.new_image()`\n```python\ncharacter = play.new_image(image='character.png', x=0, y=0, angle=0, size=100, transparency=100)\n```\n\nThis will place an image in the middle of the screen. Make sure you have a file named `character.png` in your project files for the code above to work.\n\n\n\n#### `play.new_text()`\n```python\ngreeting = play.new_text(words='hi :)', x=0, y=0, angle=0, font=None, font_size=50, color='black', transparency=100)\n```\n\nThis will put some text on the screen.\n\nIf you want to change the font, you'll need a font file (usually named something like `Arial.ttf`) in your project files. Then you can change `font=None` to `font='Arial.ttf'`.\n\n\n\n#### `play.new_circle()`\n```python\nball = play.new_circle(color='black', x=0, y=0, radius=100, border_color=\"light blue\", border_width=0, transparency=100)\n```\n\nThis will put a black circle in the middle of the screen.\n\n\n\n#### `play.new_line()`\n```python\nline = play.new_line(color='black', x=0, y=0, length=100, angle=0, thickness=1, x1=None, y1=None)\n```\n\nThis will create a thin line on the screen.\n\n\n\n#### `play.set_backdrop()`\nYou can change the background color with the `play.set_backdrop()` command:\n\n```python\nplay.set_backdrop('light blue')\n```\n\nThere are [lots of named colors to choose from](https://upload.wikimedia.org/wikipedia/commons/2/2b/SVG_Recognized_color_keyword_names.svg). Additionally, if you want to set colors by RGB (Red Green Blue) values, you can do that like this:\n\n```python\n# Sets the background to white. Each number can go from 0 to 255\nplay.set_backdrop( (255, 255, 255) )\n```\n\nAnywhere you can set a color in Python Play, you can do it using a named color like `'red'` or an RGB value above like `(255, 255, 255)` or even an RGBA value like `(0, 0, 0, 127)` (the fourth number is transparency from 0 to 255). You can get the current background color with `play.backdrop`.\n\n\n\n\n## Animation and Control Commands\n\n#### `@play.repeat_forever`\nTo make things move around, you can start by using `@play.repeat_forever`, like this:\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.repeat_forever\ndef do():\n\n cat.turn(10) \n``` \n\nThe above code will make the cat turn around forever. Sprites have other commands that you can see in the next section called Sprite Commands.\n\n#### `@play.when_program_starts`\n\nTo make some code run just at the beginning of your project, use `@play.when_program_starts`, like this:\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.when_program_starts\ndef do():\n\n cat.turn(180) \n```\n\nThis will make the cat turn upside down instantly when the program starts.\n\n\n#### `await play.timer(seconds=1)`\n\nTo run code after a waiting period, you can use the `await play.timer()` command like this:\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.when_program_starts\nasync def do():\n\n cat.turn(180) \n await play.timer(seconds=2)\n cat.turn(180) \n```\n\nThis will make the cat turn upside down instantly when the program starts, wait 2 seconds, then turn back up again.\n\n\n#### `play.repeat()` and `await play.animate()`\n\nTo smoothly animate a character a certain number of times, you can use `play.repeat()` with `await play.animate()`, like this:\n\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.when_program_starts\nasync def do():\n for count in play.repeat(180):\n cat.turn(1)\n await play.animate()\n```\n\nThis code will animate the cat turning upside down smoothly when the program starts.\n\nTo break down the code:\n- `for count in play.repeat(180):` runs the code 180 times.\n- `cat.turn(1)` turns that cat 1 degree each time.\n- `await play.animate()` makes the cat animate smoothly. Without this command, the cat would just turn upside down instantly.\n\nNote: to use `await play.animate()` and `await play.timer()`, the word `async` must be included before `def` in your function definition.\n\n\n\n\n\n\n## Sprite Commands\n\n\n#### Simple commands\n\nSprites (images and text) have a few simple commands:\n\n- **`sprite.move(10)`** \u2014 moves the sprite 10 pixels in the direction it's facing (starts facing right). Use negative numbers (-10) to go backward.\n- **`sprite.turn(20)`** \u2014 Turns the sprite 20 degrees counter-clockwise. Use negative numbers (-20) to turn the other way.\n- **`sprite.go_to(other_sprite)`** \u2014 Makes `sprite` jump to another sprite named `other_sprite`'s position on the screen. Can also be used to make the sprite follow the mouse: `sprite.go_to(play.mouse)`.\n- **`sprite.go_to(x=100, y=50)`** \u2014 Makes `sprite` jump to x=100, y=50 (right and up a little).\n- **`sprite.point_towards(other_sprite)`** \u2014 Turns `sprite` so it points at another sprite called `other_sprite`.\n- **`sprite.point_towards(x=100, y=50)`** \u2014 Turns `sprite` so it points toward x=100, y=50 (right and up a little).\n- **`sprite.hide()`** \u2014 Hides `sprite`. It can't be clicked when it's hidden.\n- **`sprite.show()`** \u2014 Shows `sprite` if it's hidden.\n- **`sprite.clone()`** \u2014 Makes a copy or clone of the sprite and returns it.\n- **`sprite.remove()`** \u2014 Removes a sprite from the screen permanently. Calling sprite commands on a removed sprite won't do anything.\n- **`sprite.start_physics()`** \u2014 Turn on physics for a sprite. See the [Physics Commands section](#physics-commands) for details.\n- **`sprite.stop_physics()`** \u2014 Turn off physics for a sprite. See the [Physics Commands section](#physics-commands) for details.\n\n\n#### Properties\n\nSprites also have properties that can be changed to change how the sprite looks. Here they are:\n\n- **`sprite.x`** \u2014 The sprite's horizontal position on the screen. Positive numbers are right, negative numbers are left. The default is 0.\n- **`sprite.y`** \u2014 The sprite's vertical position on the screen. Positive numbers are up, negative numbers are down. The default is 0.\n- **`sprite.size`** \u2014 How big the sprite is. The default is 100, but it can be made bigger or smaller.\n- **`sprite.angle`** \u2014 How much the sprite is turned. Positive numbers are counter-clockwise. The default is 0 degrees (pointed to the right).\n- **`sprite.transparency`** \u2014 How see-through the sprite is from 0 to 100. 0 is completely see-through, 100 is not see-through at all. The default is 100.\n- **`sprite.is_hidden`** \u2014 `True` if the sprite has been hidden with the `sprite.hide()` command. Otherwise `False`.\n- **`sprite.is_shown`** \u2014 `True` if the sprite has not been hidden with the `sprite.hide()` command. Otherwise `False`.\n- **`sprite.left`** \u2014 The x position of the left-most part of the sprite.\n- **`sprite.right`** \u2014 The x position of the right-most part of the sprite.\n- **`sprite.top`** \u2014 The y position of the top-most part of the sprite.\n- **`sprite.bottom`** \u2014 The y position of the bottom-most part of the sprite.\n- **`sprite.physics`** \u2014 Contains the physics properties of an object if physics has been turned on. The default is `None`. See the [Physics Commands section](#physics-commands) for details.\n\n\n\nImage-sprite-only properties:\n\n- **`sprite.image`** \u2014 The filename of the image shown. If `None` is provided initially, a blank image will show up.\n\nText-sprite-only properties:\n\n- **`text.words`** \u2014 The displayed text content. The default is `'hi :)'`.\n- **`text.font`** \u2014 The filename of the font e.g. 'Arial.ttf'. The default is `None`, which will use a built-in font.\n- **`text.font_size`** \u2014 The text's size. The default is `50` (pt).\n- **`text.color`** \u2014 The text's color. The default is black.\n\nBox-sprite-only properties:\n- **`box.color`** \u2014 The color filling the box. The default is `black`.\n- **`box.width`** \u2014 The width of the box. The default is `100` pixels.\n- **`box.height`** \u2014 The height of the box. The default is `200` pixels.\n- **`box.border_width`** \u2014 The width of the box's border, the line around it. The default is `0`.\n- **`box.border_color`** \u2014 The color of the box's border. The default is `'light blue'`.\n\nIf the box has a border, the box's total width, including the border, will be the width defined by the `width` property.\n\nCircle-sprite-only properties:\n- **`circle.color`** \u2014 The color filling the circle. The default is `black`.\n- **`circle.radius`** \u2014 How big the circle is, measured from the middle to the outside. The default is `100` pixels, making a 200-pixel-wide circle.\n- **`circle.border_width`** \u2014 The width of the circle's border, the line around it. The default is `0`.\n- **`circle.border_color`** \u2014 The color of the circle's border. The default is `'light blue'`.\n\nIf the circle has a border, the circle's total width, including the border, will be the width defined by the `radius` property.\n\n\nLine-sprite-only properties:\n- **`line.color`** \u2014 The line's color. The default is `black`.\n- **`line.length`** \u2014 How long the line is. Defaults to `100` (pixels).\n- **`line.angle`** \u2014 The angle the line points in. Defaults to `0` (degrees).\n- **`line.x1`** \u2014 The `x` coordinate of the end of the line.\n- **`line.y1`** \u2014 The `y` coordinate of the end of the line.\n\nFor lines, the `x` and `y` coordinates are where the start of the line is. You can set either the `length` and `angle` or the `x1` and `y1` properties to change where the line points. If you update one, the others will be updated automatically.\n\n\n\nThese properties can changed to do the same things as the sprite commands above. For example,\n\n```python\nsprite.go_to(other_sprite)\n\n# the line above is the same as the two lines below\n\nsprite.x = other_sprite.x\nsprite.y = other_sprite.y\n```\n\nYou can change the properties to animate the sprites. The code below makes the cat turn around.\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.repeat_forever\ndef do():\n cat.angle += 1\n # the line above is the same as cat.turn(1)\n```\n\n\n\n\n#### Other info\n\nSprites also have some other useful info:\n\n- **`sprite.width`** \u2014 Gets how wide the sprite is in pixels.\n- **`sprite.height`** \u2014 Gets how tall the sprite is in pixels.\n- **`sprite.distance_to(other_sprite)`** \u2014 Gets the distance in pixels to `other_sprite`.\n- **`sprite.distance_to(x=100, y=100)`** \u2014 Gets the distance to the point x=100, y=100.\n- **`sprite.is_clicked`** \u2014 `True` if the sprite has just been clicked, otherwise `False`.\n- **`sprite.is_touching(other_sprite)`** \u2014 Returns True if `sprite` is touching the `other_sprite`. Otherwise `False`.\n- **`sprite.is_touching(point)`** \u2014 Returns True if the sprite is touching the point (anything with an `x` and `y` coordinate). For example: `sprite.is_touching(play.mouse)`\n\n\n\n\n\n\n\n## Mouse Commands\n\nWorking with the mouse in Python Play is easy. Here's a simple program that points a sprite at the mouse:\n\n```python\narrow = play.new_text('-->', font_size=100)\n\n@play.repeat_forever\ndef do():\n arrow.point_towards(play.mouse)\n```\n\n`play.mouse` has the following properties:\n\n- **`play.mouse.x`** \u2014 The horizontal x position of the mouse.\n- **`play.mouse.y`** \u2014 The vertical y position of the mouse.\n- **`play.mouse.is_clicked`** \u2014 `True` if the mouse is clicked down, or `False` if it's not.\n- **`play.mouse.is_touching(sprite)`** \u2014 Returns `True` if the mouse is touching a sprite, or `False` if it's not.\n\n\n\n#### `@sprite.when_clicked`\n\nProbably the easiest way to detect clicks is to use `@sprite.when_clicked`.\n\nIn the program below, when the face is clicked it changes for 1 second then turns back to normal:\n\n```python\nface = play.new_text('^.^', font_size=100)\n\n@face.when_clicked\nasync def do():\n face.words = '*o*'\n await play.timer(seconds=1)\n face.words = '^.^'\n```\n\n\n\n\n#### `@play.when_sprite_clicked()`\n\nIf you wanted to run the same code when multiple sprites are clicked, you can use `@play.when_sprite_clicked()`:\n\n```python\nface1 = play.new_text('^.^', x=-100, font_size=100)\nface2 = play.new_text('^_^', x=100, font_size=100)\n\n@play.when_sprite_clicked(face1, face2) # takes as many sprites as you want\nasync def do(sprite):\n starting_words = sprite.words\n sprite.words = '*o*'\n await play.timer(seconds=1)\n sprite.words = starting_words\n```\n\nIn the above program, clicking `face1` or `face2` will run the code for each sprite separately. Note that the function is defined with a parameter e.g. `def do(sprite):` instead of just `def do():`.\n\n\n#### `@play.mouse.when_clicked` or `@play.when_mouse_clicked`\n\nTo run code when the mouse is clicked anywhere, use `@play.mouse.when_clicked` or `@play.when_mouse_clicked` (they do the same exact thing).\n\nIn the code below, when a click is detected, the text will move to the click location and the coordinates will be shown:\n\n```python\ntext = play.new_text('0, 0')\n\n@play.mouse.when_clicked\ndef do():\n text.words = f'{play.mouse.x}, {play.mouse.y}'\n text.go_to(play.mouse)\n```\n\n#### `@play.mouse.when_click_released` or `@play.when_click_released`\n\nTo run code when the mouse button is released, use `@play.mouse.when_click_released` `@play.when_click_released` (they do the same exact thing).\n\nIn the code below, the cat can be dragged around when it's clicked by the mouse:\n\n```python\ncat = play.new_text('=^.^= drag me!')\ncat.is_being_dragged = False\n\n@cat.when_clicked\ndef do():\n cat.is_being_dragged = True\n\n@play.mouse.when_click_released\ndef do():\n cat.is_being_dragged = False\n\n@play.repeat_forever\ndef do():\n if cat.is_being_dragged:\n cat.go_to(play.mouse)\n```\n\n\n\n\n\n\n## Keyboard Commands\n\n\n#### `play.key_is_pressed()`\n\nYou can use `play.key_is_pressed()` to detect keypresses.\n\nIn the code below, pressing the `arrow` keys or `w/a/s/d` will make the cat go in the desired direction.\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.repeat_forever\ndef do():\n if play.key_is_pressed('up', 'w'):\n cat.y += 15\n if play.key_is_pressed('down', 's'):\n cat.y -= 15\n\n if play.key_is_pressed('right', 'd'):\n cat.x += 15\n if play.key_is_pressed('left', 'a'):\n cat.x -= 15\n```\n\n#### `@play.when_key_pressed()`\n\nYou can use `@play.when_key_pressed()` to run code when specific keys are pressed.\n\nIn the code below, pressing the `space` key will change the cat's face, and pressing the `enter` key will change it to a different face.\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.when_key_pressed('space', 'enter') # if either the space key or enter key are pressed...\ndef do(key):\n if key == 'enter':\n cat.words = '=-.-='\n if key == 'space':\n cat.words = '=*_*='\n```\n\n\n\n\n#### `@play.when_any_key_pressed`\n\nIf you just want to detect when any key is pressed, you can use `@play.when_any_key_pressed`.\n\nIn the code below, any key you press will be displayed on the screen:\n\n```python\ntext = play.new_text('')\n\n@play.when_any_key_pressed\ndef do(key):\n text.words = f'{key} pressed!'\n```\n\n#### `@play.when_key_released()`\n\nExactly like `@play.when_key_pressed()` but runs the code when specific keys are released.\n\nIn the code below, text will appear on screen only if the `up` arrow is pressed.\n\n```python\ntext = play.new_text('')\n\n@play.when_key_released('up')\nasync def do(key):\n text.words = 'up arrow released!'\n await play.timer(seconds=1)\n text.words = ''\n```\n\n#### `@play.when_any_key_released`\n\nExactly like `@play.when_any_key_pressed` but runs the code when any key is released.\n\nIn the code below, the name of the most recently released key will show up on screen.\n\n```python\ntext = play.new_text('')\n\n@play.when_any_key_pressed\ndef do(key):\n text.words = f'{key} key released!''\n```\n\n\n\n## Physics Commands\n\nPython Play uses the [Pymunk](http://www.pymunk.org/en/master/) physics library to turn sprites into physics objects that can collide with each other, fall with gravity, and more.\n\n### `sprite.start_physics()`\n\nTo turn a sprite into a physics object, use the `start_physics()` command:\n\n```python\nsprite.start_physics(can_move=True, stable=False, x_speed=0, y_speed=0, obeys_gravity=True, bounciness=1, mass=10, friction=0.1)\n```\n\nThis will cause the sprite to start being affected by gravity, collide with other sprites that have physics, and more.\n\n\n### `sprite.physics` properties\n\nOnce `sprite.start_physics()` has been called, the sprite will have a `sprite.physics` property. `sprite.physics` has the following properties:\n\n- **`sprite.physics.can_move`** \u2014 Whether the sprite can move around the screen (`True`) or is stuck in place (`False`). Defaults to `True`.\n- **`sprite.physics.stable`** \u2014 Whether the sprite is a stable object (one that can't be knocked about). A pong paddle is a stable object (`True`) but a box or ball that can be knocked around is not (`False`). Defaults to `False`.\n- **`sprite.physics.x_speed`** \u2014 How fast the sprite is moving horizontally (negative numbers mean the sprite moves to the left and positive numbers mean the sprite moves to the right). Defaults to `0`.\n- **`sprite.physics.y_speed`** \u2014 How fast the sprite is moving vertically (negative numbers mean the sprite moves down and positive numbers mean the sprite moves up). Defaults to `0`.\n- **`sprite.physics.obeys_gravity`** \u2014 If the sprite is affected by gravity. Defaults to `True`.\n- **`sprite.physics.bounciness`** \u2014 How bouncy the sprite is from 0 (doesn't bounce at all) to 1 (bounces a lot). Defaults to `1`.\n- **`sprite.physics.mass`** \u2014 How heavy the sprite is. Defaults to `10`. Heavier objects will knock lighter objects around more.\n- **`sprite.physics.friction`** \u2014 How much the sprite slides around on other objects. Starts at 0 (slides like on ice) to big numbers (very rough sprite that doesn't slide at all). Defaults to `0.1`.\n\nChanging any of these properties will immediately change how the sprite acts as a physics object. Try experimenting with all these properties if you don't fully understand them.\n\n`sprite.physics` also has two commands that could be helpful:\n\n- **`sprite.physics.pause()`** \u2014 Temporarily stop the sprite from being a physics object. The sprite's speed and other physics properties will be saved until the `unpause()` command is used.\n- **`sprite.physics.unpause()`** \u2014 Resume physics on a sprite that has been paused. It will continue with the exact speed and physics settings it had before `physics.pause()` was called.\n\nCalling `sprite.stop_physics()` will immediately stop the sprite from moving and colliding and `sprite.physics` will be set to `None`.\n\n\n### `sprite.stop_physics()`\n\nTo get a sprite to stop moving around and colliding, you can call `sprite.stop_physics`:\n\n```python\nsprite.stop_physics()\n```\n\nThis will immediately stop the sprite.\n\n\n### `play.set_gravity()`\n\nTo set how much gravity there is for sprites that have had `start_physics()` called on them, use the `play.set_gravity()` command:\n\n```python\nplay.set_gravity(vertical=-100, horizontal=None)\n```\n\nYou can access the current gravity with `play.gravity.vertical` (default is `-100`) and `play.gravity.horizontal` (default is `0`).\n\n\n\n\n## Other Useful Commands\n\n\n#### `play.screen`\n\nThe way to get information about the screen. `play.screen` has these properties:\n\n- `play.screen.width` - Defaults to 800 (pixels total). Changing this will change the screen's size.\n- `play.screen.height` - Defaults to 600 (pixels total). Changing this will change the screen's size.\n- `play.screen.left` - The `x` coordinate for the left edge of the screen.\n- `play.screen.right` - The `x` coordinate for the right edge of the screen.\n- `play.screen.top` - The `y` coordinate for the top of the screen.\n- `play.screen.bottom` - The `y` coordinate for the bottom of the screen.\n\n\n#### `play.all_sprites`\n\nA list of all the sprites (images, shapes, text) in the program.\n\n\n#### `play.random_number()`\n\nA function that makes random numbers.\n\nIf two whole numbers are given, `play.random_number()` will give a whole number back:\n\n```python\nplay.random_number(lowest=0, highest=100)\n\n# example return value: 42\n```\n(You can also do `play.random_number(0, 100)` without `lowest` and `highest`.)\n\nIf non-whole numbers are given, non-whole numbers are given back:\n\n```python\nplay.random_number(0, 1.0)\n# example return value: 0.84\n```\n\n`play.random_number()` is also inclusive, which means `play.random_number(0,1)` will return `0` and `1`.\n\n\n#### `play.random_color()`\n\nReturns a random RGB color, including white and black.\n\n```python\nplay.random_color()\n# example return value: (201, 17, 142)\n```\n\nEach value varies from 0 to 255.\n\n#### `play.random_position()`\n\nReturns a random position on the screen. A position object has an `x` and `y` component.\n\n```python\ntext = play.text('WOO')\n@play.repeat_forever\ndef do():\n text.go_to(play.random_position())\n\n # the above is equivalent to:\n position = play.random_position()\n text.x = position.x\n text.y = position.y\n```\n\n#### `play.repeat()`\n\n`play.repeat()` is the same as Python's built-in `range` function, except it starts at 1. 'Repeat' is just a friendlier and more descriptive name than 'range'.\n\n```python\nlist(play.repeat(10))\n# return value: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n```\n\n#### `await play.animate()`\n\nWhen used in a loop, this command will animate any sprite changes that happen.\n\n```python\ncat = play.new_text('=^.^=')\n\n@play.when_program_starts\nasync def do():\n for count in play.repeat(360):\n cat.turn(1)\n await play.animate()\n```\n\n`await play.animate()` is the same as `await asyncio.sleep(0)` except it has a friendlier name for beginners.\n\n\n## What's with all this `async`/`await` stuff? Is this Python?\n\nYes, this is Python! Python added `async` and `await` as special keywords in Python 3.7. It's part of the [asyncio module](https://docs.python.org/3/library/asyncio.html).\n\nUsing async functions means we can use the `await play.timer()` and `await play.animate()` functions, which makes some code a lot simpler and appear to run in-parallel, which new programmers find intuitive.\n\n```python\nimport play\n\ncat = play.new_text('=^.^=')\n\n# this code block uses async so it can use the 'await play.timer()' function\n@play.repeat_forever\nasync def change_bg():\n play.set_backdrop('pink')\n await play.timer(seconds=1)\n\n play.set_backdrop('purple')\n await play.timer(seconds=1)\n\n play.set_backdrop('light blue')\n await play.timer(seconds=1)\n\n# this code block doesn't need async because it doesn't have `await play.timer()` or `await play.animate()`\n@play.repeat_forever\ndef do():\n cat.turn(1)\n\nplay.start_program()\n```\n\nIn the above program, the backdrop will change and the cat will appear to turn at the same time even though the code is running single-threaded.\n\nThe `async` keyword isn't necessary to write unless you want to use `await` functions. If you try to use an `await` command inside a non-async function, Python will show you an error like this:\n\n``` \n File \"example.py\", line 31\n await play.timer(seconds=1)\n ^\nSyntaxError: 'await' outside async function\n```\nTo fix that error, just put `async` before `def`.\n\nIf you don't understand any of this, it's generally safe to just include `async` before `def`.\n\n## Why use Python Play?\n\nPython Play was designed to be an excellent starting point for brand new programmers. The goal of the project is to give someone that has never programmed before a compelling and successful experience in their first few minutes of programming. We aimed to make graphics programming as accessible as possible to as young an audience as possible.\n\nWe found that many existing programming languages and graphics libraries presented unnecessary difficulties for new programmers \u2014 difficulties making simple things happen, confusing language, confusing program flow, unexplained concepts, etc. We know that even one initial disagreeable experience can turn people away from programming forever, and we wanted to prevent that outcome as much as possible.\n\nPython Play was inspired by [MIT's Scratch](https://scratch.mit.edu), which has introduced millions of children and adults to programming and helped them to create and share personally meaningful computational projects. In fact, Python Play's main designer worked on Scratch professionally for a brief period. But we found that for some learners, Scratch \u2014 with its graphical blocks and colorful interface \u2014 didn't feel like \"real programming\". For those learners wishing to use a mainstream textual programming language while removing the difficulties of graphics programming in these languages, we made Python Play.\n\n\nPython Play was designed with the following principles in mind:\n\n- No boilerplate - every line of code should do something meaningful and understandable. We want to limit the number of times a learner needs to ask \"why do we have to include this line of code?\"\n\n- As much as possible, commands should have immediate visual effects. For example, if a programmer types a `new_image` command the sprite should show up immediately on the screen. They shouldn't need to understand the invisible distinction between initializing a sprite and drawing the sprite.\n\n- Lines of code should be easily copy and pasted.\n\n- Command values should have descriptive labels that make it as clear as possible what the value means. Instead of `play.new_image('character.png', 50, 100)`, `play.new_image(image='character.png', x=50, y=100)`.\n\n- Use plain English as much as possible. For mathematical concepts, try to use language programmers might see in math classes. Try to use short names that are easier for younger people to type and spell. Make errors as clear and constructive as possible. Many of the commands and names were borrowed from Scratch, whose designers have spent decades working with children and observing what language makes sense to them.\n\n\nPython Play was also designed with a custom Repl.it IDE in mind (coming soon), one that significantly lowers the usability problems of programming (installing the language, using a text editor, using the terminal, running programs, showing which commands are available, etc).\n\nWhile the learning curve for Python and Python Play are still far from ideal for new programmers, we still think Python Play provides a great way for new programmers to start programming with graphics.\n\n<3\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/replit/play", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "replit-play", "package_url": "https://pypi.org/project/replit-play/", "platform": "", "project_url": "https://pypi.org/project/replit-play/", "project_urls": { "Homepage": "https://github.com/replit/play" }, "release_url": "https://pypi.org/project/replit-play/0.0.23/", "requires_dist": [ "pygame", "numpy", "pymunk" ], "requires_python": ">=3.5", "summary": "The easiest way to make games and media projects in Python.", "version": "0.0.23" }, "last_serial": 5333345, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "15fa0696b278d734b2e5e7cc72fdd80b", "sha256": "1a800812b13beaebab5822aa466b33cbb147d50667660880df1e7bcb68820def" }, "downloads": -1, "filename": "replit_play-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "15fa0696b278d734b2e5e7cc72fdd80b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 15743, "upload_time": "2019-03-18T03:29:36", "url": "https://files.pythonhosted.org/packages/d1/29/09d04111a27da63a227aa4a7f680baf24143ec171c0a628abcc4a5306f1e/replit_play-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e66f92896eab6e415fef3cb4adb3e8cd", "sha256": "494648bad767cf6b5239d7ffad804b5c66ac31e0a3524f929bde3974088ea79a" }, "downloads": -1, "filename": "replit-play-0.0.1.tar.gz", "has_sig": false, "md5_digest": "e66f92896eab6e415fef3cb4adb3e8cd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 91415, "upload_time": "2019-03-18T03:29:38", "url": "https://files.pythonhosted.org/packages/b1/d9/17baf98a84d9263d872887f64a2abf8561acb49c73bf26df6555b9189929/replit-play-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "1909e382ee4c91ff92fc6ffe06e10c75", "sha256": "3a8d0c50c6c8589f3c28b66211d77e9ee3b469b8accf8f9e2a865534bb594889" }, "downloads": -1, "filename": "replit_play-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "1909e382ee4c91ff92fc6ffe06e10c75", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 24759, "upload_time": "2019-03-31T19:07:15", "url": "https://files.pythonhosted.org/packages/37/de/2f18da5885073fa791966bc3a31e264cdcc8a9f67826e50f2ffa3c75c6bf/replit_play-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b94ab5a967604df4b2c3fa1ee5bd8f4", "sha256": "404de1f14a1c7ac21ef38531c4310c5fa38d27d4f446837fa488cf4722dd7cfd" }, "downloads": -1, "filename": "replit-play-0.0.10.tar.gz", "has_sig": false, "md5_digest": "4b94ab5a967604df4b2c3fa1ee5bd8f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 103823, "upload_time": "2019-03-31T19:07:17", "url": "https://files.pythonhosted.org/packages/af/15/b1a712ae0850fa257aa92f18e4ae38a64ccd8deb240c306aebed313f4e41/replit-play-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "f402c3067a767e65c679bd31c22d5d87", "sha256": "2ee615ecada098facd26806ed70104dcd0f41cbc870fd358d43a82ee429e379f" }, "downloads": -1, "filename": "replit_play-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "f402c3067a767e65c679bd31c22d5d87", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29056, "upload_time": "2019-04-22T23:00:40", "url": "https://files.pythonhosted.org/packages/c2/b8/993100ad66489b870f573522930acb9266a6150c3eac8b9885b11516fa73/replit_play-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30b522b4f5757670768f7235be1d7763", "sha256": "2a4dc826fd4d1e8a03bb631fdd9a2cd46e0e0c1aaf2337143ba639a889a1918a" }, "downloads": -1, "filename": "replit-play-0.0.11.tar.gz", "has_sig": false, "md5_digest": "30b522b4f5757670768f7235be1d7763", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 108268, "upload_time": "2019-04-22T23:00:45", "url": "https://files.pythonhosted.org/packages/fc/5a/0edc8f7efb0c4e180aea5807ca523c04b632fe55ce80f2cbf366fe00e4a4/replit-play-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "0ac4ed082a76081aebf8fefc6809e912", "sha256": "b4866bdf7c5c121856018c569f9b6951395e6c6500844cccce9f445c4f0aaca6" }, "downloads": -1, "filename": "replit_play-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "0ac4ed082a76081aebf8fefc6809e912", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29055, "upload_time": "2019-04-22T23:09:04", "url": "https://files.pythonhosted.org/packages/c6/53/1482d660dd4382c1a1ec37b208747607f3125706e0d90e14b943f85e94a6/replit_play-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9539ba5fdf8e0ba9ee5df203962ec146", "sha256": "1cb0704fe4b4aa858d5747d0960de6857afba28e1e53763287edbfd5f3696939" }, "downloads": -1, "filename": "replit-play-0.0.12.tar.gz", "has_sig": false, "md5_digest": "9539ba5fdf8e0ba9ee5df203962ec146", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 108266, "upload_time": "2019-04-22T23:09:09", "url": "https://files.pythonhosted.org/packages/fb/26/28af5518738432ad3d5204d906913b3a7082409c920f2e07923f9cc7b01b/replit-play-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "3cac339318fcd1b05ec54da281762c7f", "sha256": "cfe02033c0b406d8a5a330b7dc0f9d992a45908c93e5a8caef85133687526be6" }, "downloads": -1, "filename": "replit_play-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "3cac339318fcd1b05ec54da281762c7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29184, "upload_time": "2019-04-23T03:42:06", "url": "https://files.pythonhosted.org/packages/b0/cd/5abfb81c746a19e24eda0a2b6d02ad5141cd09fa3ddaa2d677caa2af88f3/replit_play-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "098fe72b04450e0b702c4eeaabb75331", "sha256": "441c0e7a8e14045dc89e9a02430751db0ea91fdfdf491d9387e70bffc42e30d4" }, "downloads": -1, "filename": "replit-play-0.0.13.tar.gz", "has_sig": false, "md5_digest": "098fe72b04450e0b702c4eeaabb75331", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 108432, "upload_time": "2019-04-23T03:42:11", "url": "https://files.pythonhosted.org/packages/a8/ee/fa6f48fa8455984d10d63e76db8cd2e715a85955c5a0264a339ed7f3057a/replit-play-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "cca8e2590111ee79b1ca6805600db0d4", "sha256": "9445f036415935f839f3fd645878a95f3d3e2ba0474c0ff8428899830f6e41fd" }, "downloads": -1, "filename": "replit_play-0.0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "cca8e2590111ee79b1ca6805600db0d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29436, "upload_time": "2019-04-23T03:59:41", "url": "https://files.pythonhosted.org/packages/47/fd/86113901a225de054477c3bcea85cc61f1091c583b8e984770b285acfd31/replit_play-0.0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8845b813276d653deaea403ed3767ac8", "sha256": "bf65a8096025f8aa848ad43645bb23b4f254bd83799737782876de22c91caf08" }, "downloads": -1, "filename": "replit-play-0.0.14.tar.gz", "has_sig": false, "md5_digest": "8845b813276d653deaea403ed3767ac8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 108952, "upload_time": "2019-04-23T03:59:46", "url": "https://files.pythonhosted.org/packages/30/de/12172fa49cb67fda22b325efca11b0cdea01893904bbfc0d9251bedc72af/replit-play-0.0.14.tar.gz" } ], "0.0.15": [ { "comment_text": "", "digests": { "md5": "190a6e66fd733a01c3136b37d651193f", "sha256": "95fefebaf40e6cf483bda95a368096871a1fbbfca818290d234fafaeb53edcf4" }, "downloads": -1, "filename": "replit_play-0.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "190a6e66fd733a01c3136b37d651193f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29620, "upload_time": "2019-04-23T04:32:37", "url": "https://files.pythonhosted.org/packages/e7/15/4b8de69bacce922a126fc5fae3908108cc5fbc04b2c528fead9e70e72921/replit_play-0.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f929dc6e855fa8bf0f1fcb598bf14c7f", "sha256": "495b263374dddf4e3fb426bf53ddbbcce6ecef914c0443e5ebbe50eed8349503" }, "downloads": -1, "filename": "replit-play-0.0.15.tar.gz", "has_sig": false, "md5_digest": "f929dc6e855fa8bf0f1fcb598bf14c7f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 109279, "upload_time": "2019-04-23T04:32:39", "url": "https://files.pythonhosted.org/packages/66/55/aa61574328e0dd7c9764f99bdb03490e248376ce7e7eeea1d0701eab5687/replit-play-0.0.15.tar.gz" } ], "0.0.16": [ { "comment_text": "", "digests": { "md5": "037c8ac0863d7290241b4e641acb1642", "sha256": "fa7a2bf73f05851bf1c39a3ea5a7032b61bb92eb29559713c5e0826ad8eb1a0f" }, "downloads": -1, "filename": "replit_play-0.0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "037c8ac0863d7290241b4e641acb1642", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29610, "upload_time": "2019-04-23T17:29:58", "url": "https://files.pythonhosted.org/packages/55/b4/b8db808c16832deba7feabafca4cad6f5806514d46de420d5e8bced771e9/replit_play-0.0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9d6a51068bdfd9cebbe93f13a58307fc", "sha256": "dc15403343fefba23b18322a05cf97c2f222dabccd697451508d069fad85a51e" }, "downloads": -1, "filename": "replit-play-0.0.16.tar.gz", "has_sig": false, "md5_digest": "9d6a51068bdfd9cebbe93f13a58307fc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 109285, "upload_time": "2019-04-23T17:30:00", "url": "https://files.pythonhosted.org/packages/dc/21/9bede2d35f86dab28f5e66151630d22f788b301e59545c42c02762d23513/replit-play-0.0.16.tar.gz" } ], "0.0.17": [ { "comment_text": "", "digests": { "md5": "32ebb744773caa69bdc8060c4895df3b", "sha256": "6934e79d0621ae66149d0489c4edc12318ad6e44014bb12a1584441e70807ac4" }, "downloads": -1, "filename": "replit_play-0.0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "32ebb744773caa69bdc8060c4895df3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29625, "upload_time": "2019-04-23T21:09:41", "url": "https://files.pythonhosted.org/packages/13/c4/8dd1afa5bce3bd1222e0a86f903a11631d59d2b0afb526583c081476166a/replit_play-0.0.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d10f5aac9c6e12b1493aa42fe56ad9b", "sha256": "5d70ebf6d571d03cb2bf977538bf733cc85ee9a1cc4011ed9f0e646559d7b24d" }, "downloads": -1, "filename": "replit-play-0.0.17.tar.gz", "has_sig": false, "md5_digest": "7d10f5aac9c6e12b1493aa42fe56ad9b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 109301, "upload_time": "2019-04-23T21:09:43", "url": "https://files.pythonhosted.org/packages/20/7f/b80914b5fa6ba2b87606204b27a22990674b96d054523d2621d59c7bda8c/replit-play-0.0.17.tar.gz" } ], "0.0.18": [ { "comment_text": "", "digests": { "md5": "845778dabe1d31251f0b3755acff0dd6", "sha256": "f65b80b7467ea002572ea455b876d1d42bc9f833239ada7ed51679a346832612" }, "downloads": -1, "filename": "replit_play-0.0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "845778dabe1d31251f0b3755acff0dd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30612, "upload_time": "2019-04-27T16:56:46", "url": "https://files.pythonhosted.org/packages/0d/67/21a824c4f5786ced39288c2406496a0612e7cce9b40f1c98e4ae4eb19cc5/replit_play-0.0.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90c8c157c80247fd20a0c2b6ae4cddec", "sha256": "200a5b4b51620ca92fcd8892f88435b320887d11124e3872a7ffff7a594f074b" }, "downloads": -1, "filename": "replit-play-0.0.18.tar.gz", "has_sig": false, "md5_digest": "90c8c157c80247fd20a0c2b6ae4cddec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115005, "upload_time": "2019-04-27T16:56:50", "url": "https://files.pythonhosted.org/packages/5e/93/e039b66b497bff72e950310d291b3059d4e04d3d84fd64119c86a9438734/replit-play-0.0.18.tar.gz" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "002beeb7202dc32ef730007c46e620e1", "sha256": "563210673ee45fa83919edb4f967e76c75f46247a57ca4a8d1b5a5e9e1c68c50" }, "downloads": -1, "filename": "replit_play-0.0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "002beeb7202dc32ef730007c46e620e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30648, "upload_time": "2019-04-28T18:11:17", "url": "https://files.pythonhosted.org/packages/dc/a4/5c57fb2014f9be64acdcaa8217d34248576a2a8cbd8b3f37a0d946bdf2db/replit_play-0.0.19-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2da23db0946bb6af53ece74de5ad9d2e", "sha256": "e90c728c1981e87abaac53a0b7a6782561d9890f08f0aa1cc531321e463e0c8b" }, "downloads": -1, "filename": "replit-play-0.0.19.tar.gz", "has_sig": false, "md5_digest": "2da23db0946bb6af53ece74de5ad9d2e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115111, "upload_time": "2019-04-28T18:11:20", "url": "https://files.pythonhosted.org/packages/11/0a/4923bd600bcc6f125466404d087d6a3c5e0e3766a6c593e17595a39b3b00/replit-play-0.0.19.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "28842682f7f029d3a03b10d07c7db8e7", "sha256": "58f46b5c08975ef09f62eb6d94acea50ccb4d5b8d37023029a5afd3972dbb4cc" }, "downloads": -1, "filename": "replit_play-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "28842682f7f029d3a03b10d07c7db8e7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 15797, "upload_time": "2019-03-20T02:22:49", "url": "https://files.pythonhosted.org/packages/17/75/6d0f115eb8c8235f87fe271384c5d067011e3e32e6fe0095b89b484004d2/replit_play-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d450fca45521c5fd46dd2973f861436", "sha256": "1cd171b4c1d0ff491668fcdc38aa6bc82da32e2370c95e888946d7144e708b94" }, "downloads": -1, "filename": "replit-play-0.0.2.tar.gz", "has_sig": false, "md5_digest": "0d450fca45521c5fd46dd2973f861436", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 91551, "upload_time": "2019-03-20T02:22:51", "url": "https://files.pythonhosted.org/packages/4d/b9/eca70fce0dfb1909f6116174bb1fe7a8bc9e29e36b964699cf4b0ce72919/replit-play-0.0.2.tar.gz" } ], "0.0.20": [ { "comment_text": "", "digests": { "md5": "e2ac90da277c749908474f47b2b1bc1b", "sha256": "7f201c909afbfdef0e5a5705b63b348f9c243d928d8d24289d70ccced843be97" }, "downloads": -1, "filename": "replit_play-0.0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "e2ac90da277c749908474f47b2b1bc1b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30682, "upload_time": "2019-04-29T14:01:34", "url": "https://files.pythonhosted.org/packages/81/75/b147bf7cc6641ae2a512dacceb3fb154ba57178aee508b6a02a7870fba95/replit_play-0.0.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a13ac165a226a26b7783f6ddb04db59a", "sha256": "c77923bfac72a465aece8e91a24bc4ee526e3cb57804f747d0aa927739d112e9" }, "downloads": -1, "filename": "replit-play-0.0.20.tar.gz", "has_sig": false, "md5_digest": "a13ac165a226a26b7783f6ddb04db59a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115139, "upload_time": "2019-04-29T14:01:40", "url": "https://files.pythonhosted.org/packages/cb/b5/43d1197b988aba91659b8ff07a7642bb8a0cefda6314a62ccbc716ead64f/replit-play-0.0.20.tar.gz" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "ff3b3c467aab88a15b0d6735bb47ed83", "sha256": "9423886dfb5d150cf03cb38a667d11c7b9c5ab8d57b64d9ae36165c0c9d3a846" }, "downloads": -1, "filename": "replit_play-0.0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "ff3b3c467aab88a15b0d6735bb47ed83", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30851, "upload_time": "2019-04-30T01:25:42", "url": "https://files.pythonhosted.org/packages/29/dc/0389e5784f62982a8aac491ac17b331deed7bf977d8e196a24b92b11cce2/replit_play-0.0.21-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "294bd115b3354d12df049a1b2c9d7293", "sha256": "2710ae7e5bdaa1473c14513ef96f45abda6d5d6fe16513ad1e148006c2c0aa9c" }, "downloads": -1, "filename": "replit-play-0.0.21.tar.gz", "has_sig": false, "md5_digest": "294bd115b3354d12df049a1b2c9d7293", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115288, "upload_time": "2019-04-30T01:25:46", "url": "https://files.pythonhosted.org/packages/09/ba/9dab92f3353dd2ee21d4a4de014897e2ba69ad94128c58640140f1f4a379/replit-play-0.0.21.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "0f469b1a5302390406d1e738e25a615b", "sha256": "8d3c7768895d9abafcbbe0da5724c39fc42906938e288d0f7b3c281f27bdccc9" }, "downloads": -1, "filename": "replit_play-0.0.22-py3-none-any.whl", "has_sig": false, "md5_digest": "0f469b1a5302390406d1e738e25a615b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31303, "upload_time": "2019-05-16T18:09:13", "url": "https://files.pythonhosted.org/packages/5a/ce/e7f59dfa5806820f437d0e74467bf8565ff9564b660f18afa6e601bf1af5/replit_play-0.0.22-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d0c51225a5cdab9c5ce75fbeb125e0f4", "sha256": "8ef5d4d79a43c194b2686044effeb1fb3889e3bdba52227d08058c5f205e3aa7" }, "downloads": -1, "filename": "replit-play-0.0.22.tar.gz", "has_sig": false, "md5_digest": "d0c51225a5cdab9c5ce75fbeb125e0f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115713, "upload_time": "2019-05-16T18:09:15", "url": "https://files.pythonhosted.org/packages/61/37/3ea4fc0159552dba3d5c96fe695eff2f1a64b8ccfced8f3bf768d01bf804/replit-play-0.0.22.tar.gz" } ], "0.0.23": [ { "comment_text": "", "digests": { "md5": "7dffecbff31dfce178ae5815d3f19c3c", "sha256": "dd5d170fb5d790c63681ccdd8a1e739486e1404cf7824da1cb54081f8e9d0adc" }, "downloads": -1, "filename": "replit_play-0.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "7dffecbff31dfce178ae5815d3f19c3c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31303, "upload_time": "2019-05-29T16:48:07", "url": "https://files.pythonhosted.org/packages/0f/37/ea6c61c7db5f586ca4c3d0adca994f85a2a86c8e7ffdfc700b080c37eea6/replit_play-0.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1810eac672e09e55561051d4353778f5", "sha256": "f8537aa0ce104af509fdf3d73bf5b54e1266a6a2c3def39d056e0d49385a04ec" }, "downloads": -1, "filename": "replit-play-0.0.23.tar.gz", "has_sig": false, "md5_digest": "1810eac672e09e55561051d4353778f5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115726, "upload_time": "2019-05-29T16:48:10", "url": "https://files.pythonhosted.org/packages/7b/04/ba1ffa72342f3bac0cdd639cb638a588db497fa1f3662a62d045a1722e77/replit-play-0.0.23.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "377419afe9f4d98fba46d15bf6d075f5", "sha256": "619ecedbc39a6656652ccd67439afb113021c74e50b76897388bdd8e738edef3" }, "downloads": -1, "filename": "replit_play-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "377419afe9f4d98fba46d15bf6d075f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 16021, "upload_time": "2019-03-20T16:37:09", "url": "https://files.pythonhosted.org/packages/7c/41/e54d1a28bc6833203b272113912c63955d56b557c23217b3565a42046557/replit_play-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c745c55264a20b1796b1ee55ff6d6ad7", "sha256": "9f5a71370b61fc7b6a6b618b0bd43ef95aecb792abb7da56beab3c71ae494f4b" }, "downloads": -1, "filename": "replit-play-0.0.3.tar.gz", "has_sig": false, "md5_digest": "c745c55264a20b1796b1ee55ff6d6ad7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 91938, "upload_time": "2019-03-20T16:37:12", "url": "https://files.pythonhosted.org/packages/71/b6/60f76c4174ddcc27617438d85d0524de129548c6d39ed3952ac7638ab992/replit-play-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "89dbf8e36b9df0c857e6c9b9b45d0d4f", "sha256": "6081f808cbab1c303021ce05764380b67558c152ea5eee068b88b014a161759e" }, "downloads": -1, "filename": "replit_play-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "89dbf8e36b9df0c857e6c9b9b45d0d4f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 16044, "upload_time": "2019-03-20T16:55:21", "url": "https://files.pythonhosted.org/packages/24/45/7a16d8bbaf11eae890d4ff404d403628e0222d56d86f4b93cd5097ac8662/replit_play-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e5724d3f584b28b590ecab5d802b12b", "sha256": "af4c181d8de987d54d90333dd2cc5cc73cc4e9418e4263aefcd0786ee2421054" }, "downloads": -1, "filename": "replit-play-0.0.4.tar.gz", "has_sig": false, "md5_digest": "8e5724d3f584b28b590ecab5d802b12b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 91982, "upload_time": "2019-03-20T16:55:23", "url": "https://files.pythonhosted.org/packages/dd/6d/2b9343dda161069316e1069743ee1b5129cd9f33c9f2efc00c9112a40cb0/replit-play-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "d12f5cebe58b27b9ab514c7d907ded8f", "sha256": "13c19c8e9d29f7b9bbacb91bfd9c8c7b64452213a22586e33814f252f64ee7cd" }, "downloads": -1, "filename": "replit_play-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "d12f5cebe58b27b9ab514c7d907ded8f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 16694, "upload_time": "2019-03-25T22:49:32", "url": "https://files.pythonhosted.org/packages/dd/7e/e1da21ba118ca21dd55b65e20ea16c1b0bc2dbed1af558bbbf90f47fa273/replit_play-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23325ed7d2ade2d6482e147c7dbefdb1", "sha256": "9215a1746e9286d21d535d819b9dd0abfd4dbad14e0fd430a08a8c7f851d42fc" }, "downloads": -1, "filename": "replit-play-0.0.5.tar.gz", "has_sig": false, "md5_digest": "23325ed7d2ade2d6482e147c7dbefdb1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 92928, "upload_time": "2019-03-25T22:49:34", "url": "https://files.pythonhosted.org/packages/76/3c/a0b9db009454d7a9093ce4ab474ff28436a1ab297f1bd6f99e5d9bec49a5/replit-play-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "6aa3d5a3d95736eb6c8ba172200a3ab0", "sha256": "93ee6c3c43cd90dfc1b0b0da3716e76c6844e93a3e1189e42c0582d74fc5eabe" }, "downloads": -1, "filename": "replit_play-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "6aa3d5a3d95736eb6c8ba172200a3ab0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 16847, "upload_time": "2019-03-26T22:08:04", "url": "https://files.pythonhosted.org/packages/e1/c5/c43bc51c9957d2ad073025632245ca789343a8289e533eec9170156625aa/replit_play-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d1ed37e818f45ff14fd3faa0701fcc4", "sha256": "49a4e8a47f53636d6fa0b6425261b706655850f1d63ee474d6077beda1168daf" }, "downloads": -1, "filename": "replit-play-0.0.6.tar.gz", "has_sig": false, "md5_digest": "4d1ed37e818f45ff14fd3faa0701fcc4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 93238, "upload_time": "2019-03-26T22:08:05", "url": "https://files.pythonhosted.org/packages/b2/8c/d11edd764e648a30ba7d7028aa37b2250332d02b5204fa03b58997cf26e5/replit-play-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "9c8c45be6e1dcc25c4545e5f247c5654", "sha256": "bb533a872af36a9a472c1a95489169d08ac36bd81d0f86354a250816c5f7d27f" }, "downloads": -1, "filename": "replit_play-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "9c8c45be6e1dcc25c4545e5f247c5654", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 16998, "upload_time": "2019-03-26T22:37:18", "url": "https://files.pythonhosted.org/packages/6e/56/e2f47639da34359bfbb72dd1c44c7069ccfea102d41f5bf1c5ed08088a06/replit_play-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0b523e6c4faf3b5eb8e2b23c00d4e37", "sha256": "c2f95ec270cc557662945b5ad1d6e8a2a986ad38d5e23bd7966301f0e8f2d494" }, "downloads": -1, "filename": "replit-play-0.0.7.tar.gz", "has_sig": false, "md5_digest": "a0b523e6c4faf3b5eb8e2b23c00d4e37", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 93385, "upload_time": "2019-03-26T22:37:20", "url": "https://files.pythonhosted.org/packages/d8/ee/0675927fb1c42f455c2cbdeec245c29c65977377c1852c09d713c2d49961/replit-play-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "d935d6280daef13dfa2053e60d0b6ffe", "sha256": "2fe8b0aece06bb7bb69b0c4ab03b6d2ada6155ff5b7adfc4eaa3e77952622864" }, "downloads": -1, "filename": "replit_play-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "d935d6280daef13dfa2053e60d0b6ffe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 17131, "upload_time": "2019-03-27T17:21:45", "url": "https://files.pythonhosted.org/packages/74/8b/c5811ae85d5d71df28507222444e13bba351f6f9d5d947672b71dea9859b/replit_play-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa21dc932ed271de28b40ee9ab59c76d", "sha256": "4b410b6297c816f828f50aec9ef4636d5473a835a9f4e40b48ef0e5dae69859b" }, "downloads": -1, "filename": "replit-play-0.0.8.tar.gz", "has_sig": false, "md5_digest": "aa21dc932ed271de28b40ee9ab59c76d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 93608, "upload_time": "2019-03-27T17:21:47", "url": "https://files.pythonhosted.org/packages/58/5a/e1b4dae7f4452e871e59ae7ea93af2981a056355e0dc6b844926327fb1b3/replit-play-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "20e115d8015531b906751a816f854dc1", "sha256": "707392b2f5ea4ca9535445547651bfb8c434f43278e0b44584a805b0543e887f" }, "downloads": -1, "filename": "replit_play-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "20e115d8015531b906751a816f854dc1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 17960, "upload_time": "2019-03-29T18:58:47", "url": "https://files.pythonhosted.org/packages/70/f3/2a5911befa5a8a490c3e44813b26fdb98e194eade61eb303804f5f967167/replit_play-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d377664c3bf7487fbff6baad8302d4de", "sha256": "a422cc7a5c66587a2aa6875e4b077d28534e48411fc6ec751de2858ec9d2a904" }, "downloads": -1, "filename": "replit-play-0.0.9.tar.gz", "has_sig": false, "md5_digest": "d377664c3bf7487fbff6baad8302d4de", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 95122, "upload_time": "2019-03-29T18:58:48", "url": "https://files.pythonhosted.org/packages/24/7a/cdb85168dc570cd7fb87ca07f84463c1cc085cda7d47282bb977641baa5b/replit-play-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7dffecbff31dfce178ae5815d3f19c3c", "sha256": "dd5d170fb5d790c63681ccdd8a1e739486e1404cf7824da1cb54081f8e9d0adc" }, "downloads": -1, "filename": "replit_play-0.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "7dffecbff31dfce178ae5815d3f19c3c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31303, "upload_time": "2019-05-29T16:48:07", "url": "https://files.pythonhosted.org/packages/0f/37/ea6c61c7db5f586ca4c3d0adca994f85a2a86c8e7ffdfc700b080c37eea6/replit_play-0.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1810eac672e09e55561051d4353778f5", "sha256": "f8537aa0ce104af509fdf3d73bf5b54e1266a6a2c3def39d056e0d49385a04ec" }, "downloads": -1, "filename": "replit-play-0.0.23.tar.gz", "has_sig": false, "md5_digest": "1810eac672e09e55561051d4353778f5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 115726, "upload_time": "2019-05-29T16:48:10", "url": "https://files.pythonhosted.org/packages/7b/04/ba1ffa72342f3bac0cdd639cb638a588db497fa1f3662a62d045a1722e77/replit-play-0.0.23.tar.gz" } ] }