Skip to main content

An (easy) graphical library.

Project description

no more image *sob*

D O C U M E N T A T I O N

license Get It On Made with Status Difficulty Type Made with

I - Capabilities and installation:

  • Primitives(basic shapes): Squares, Circles, Triangles, and more, with their geometrical operations(area, perrimeter, etc)
  • Custom shapes(via Vertex): Since Sketchable is based on the Vertex(basic x and y coodronates), you can make Polygons(with an unlimited nr of Vertexes), or an VertexSquare(an square made of vertexes)
  • Motion, basic physics and collisions: The Vertex also helps with collisions, making every shape you do colide(of course, only moveable ones). You just define a shape, then you can move/rotate it or resize it!
  • Keyboard/Mouse Input and simulation of it: The library supports listening/simulating for keyboard/mouse input, allowing you to create interactive applications, and automate/test some tasks by simulating key presses and mouse clicks.
  • Sound: The library also has a sound module that can play WAV files natively, and can decode and play other formats with FFmpeg installed.
  • Fast updates: i am updating this library quite often(almost every day)! Especially bugfixes, my ahh can't make some nice code. Bugfixes will be part of most updates, so you can enjoy the smoothest, most stable experience! also we have issues so you can report bugs/suggestions there.

II - Installation

  1. Via pip: run pip install sketchable, and pip install --upgrade sketchable for updating.
  2. clone the repo into your project but only if you are lowk deranged who would even do that?

[!IMPORTANT] The old and depricated pydraw-turtle package contains the folowing Sketchable versions: 1.0.0-1.3.7. use the new sketchable package for the latest versions, and the old one only if you want to use the old versions, but i don't see why would you want to do that, since the new ones are better in every way possible.

III - How2Use:

1. Shapes and their initialisations(one with ※ can be used with the Motion class):

In Sketchable, all shapes rely on the crucial Vertex. It is an uni-dimensional imaginary dot with an set of coordonates, from where all primitives are based! And in version 1.3.5, the Cluster has been added(and the list specifies what shapes are Cluster-compatible) that is an array of Vertex elements. The methods Cluster has are:

  • from_list(list[Vertex]) - Converts an List full of vertexes into an Cluster
  • add(v: Vertex) - Adds an Vertex
  • remove(index: int) - Removes an Vertex from an index.
  • pop(index: int) - Removes and returns an Vertex from an index.
  • shift_to(index: int, vx: float, vy: float) and shift_by(same arguments - Moves to/by an Vertex from an index)

List of shapes and their initialisations:

  • Line: line = Line(v1: Vertex, v2: Vertex/vertexes: Cluster)
  • Vertex: vertex = Vertex(x: float, y: float)
  • Circle: circle = Circle(center: Vertex, radius: float)
  • Triangle: triangle = Triangle(v1: Vertex, v2: Vertex, v3: Vertex/vertexes: Cluster)
  • Square: square = Square(side: int)
  • ※(formerly VertexSquare)CustomSquare: vsquare = CustomSquare(v1: Vertex, v2: Vertex, v3: Vertex, v4: Vertex/vertexes: Cluster)
  • Elipse: elipse = Elipse(center: Vertex, a: float, b: float) (has been depricated and removed prior to v1.3.5, because its lowk useless.)
  • ※(formerly RegularPolygon)SidePolygon(n-sided shape): rpoly = SidePolygon(sides: int, side_lenght: float)
  • ※(formerly Polygon)Mesh: poly = Mesh(vertecies: list/vertecies: Cluster) (make a list full of vertecies)

3. Importing:

You can import all the things Sketchable has by writing from Sketchable import * (not avabile for versions prior to 1.3.2) If your version is 1.3.1, then write from Sketchable import <what component you would want> And if your version is prior to 1.3.1, write from core import <what component you would want to import>

4. Movement:

Sketchable also suports movement, using the Motion class. To initialise the Motion class with an shape that is Movable, do: mov = Motion(shape, pen, vx, vy, colidable, CanExitWindow)

What they mean:

  • shape - Any shape that is Moveable.

  • pen: PyPen - An PyPen instance.

  • vx: float and vy: float - The initial coordonates.

  • colidable: List - An list of shapes that the current shape CAN colide(if you don't set it, it will default to None).

  • CanExitWindow: Bool - If the shape colides with the window corner.

  • For 1.3.1 and above: Use the Motion class, with the functions:

  • move_to(vx: float, vy: float);

  • move_by(vx: float, vy: float);

  • set_velocity(vx: float, vy: float);

  • accelerate(ax: float, ay: float);

  • stop();

  • check_edge_collision();

  • is_on_screen();

  • update().

Example code:
from sketchable import *

pen = PyPen("square chaos")
pen.initialise("white", 2, Speed.INSTANT, "black")

# ── squares ─────────────────────────────

s1 = Square(50)
s1.move_to(-100, -50)

s2 = Square(40)
s2.move_to(80, 60)

s3 = Square(70)
s3.move_to(0, 0)

# ── motion ──────────────────────────────

m1 = Motion(s1, pen, vx=3, vy=2, CanExitWindow=False)
m2 = Motion(s2, pen, vx=-2, vy=3.5, CanExitWindow=False)
m3 = Motion(s3, pen, vx=1.5, vy=-2.5, CanExitWindow=False)

# ── loop ────────────────────────────────

while True:
    pen.clear()

    pen.draw(s1,color="white",fill=True)
    pen.draw(s2,color="red",fill=True)
    pen.draw(s3,color="blue",fill=True)

    m1.update()
    m2.update()
    m3.update()
  • For version 1.2.0 use the Moveable class, that has the same movement commands as Motion, but whiout the collision stuff, and of course, whiout updating(you need to do it manually via pen.clear() ).
Example code:
import os
import sys
from core import PyPen, Square, Triangle, Vertex, Moveable
from turtle import *
import time

pen = PyPen("dvd!")

pen.initialise("black", 1, 1)

cube = Square(60).move_to(100, 100)

dx, dy = 3, 2  # velocity (speed in x and y)

while True:
    pen.clear()

    # move cube
    cube.move_by(dx, dy)

    x, y = cube.position
    size = cube.side

    # screen bounds (you may tweak these depending on your window)
    left, right = -395, 395
    bottom, top = -330, 330

    # bounce logic
    if x < left or x + size > right:
        dx *= -1

    if y < bottom or y + size > top:
        dy *= -1

    pen.draw(cube, color="purple", fill=True)

    pen.screen.update()
    time.sleep(0.01)

[!TIP] If you need to transition from Moveable to Motion, you just need to add mov = Motion(shape, pen, vx and vy), and it will automaticly change from Moveable to Motion. And yes if you want Moveable instead of Motion just don't initialise it. its called backwards compatability :D (i think)

IV - Sound:

Sketchable has a sound module, that can play WAV files natively, and can decode and play other formats with FFmpeg installed. You can use the Speakers class to play audio files. Just create an instance of Speakers with the path to your audio file, and call the play() method to play it. If your file is not a WAV file, you can call the decode() method first with the appropriate file type (e.g., "mp3", "ogg", etc.) to decode it into memory before playing.

Example code:
from sketchable import Speakers
speaker = Speakers("path/to/your/audiofile.mp3")
speaker.decode("mp3")
speaker.play()

V - Keyboard input[REMADE IN 1.3.7]:

Sketchable also has a keyboard module that allows you to listen/simulate to keyboard input. You can use the Keyboard class to listen for key presses. Just create an instance of Keyboard, and call the start_listening() method to start listening for keyboard input. You can also specify a callback function that will be called whenever a key is pressed.

Example code:
from sketchable import Keyboard
kb = Keyboard()

kb.is_key_pressed('esc').
kb.simulate_key_press('l')
  • Also in v1.3.7, it got reworked to be both easier, but it now has the ability to simulate key presses. Both Mouse and Keyboard are in externals.py, and were written entirely by me!

VI - Mouse input[NEW IN 1.3.7]:

Now, Sketchable can record mouse input, simulate and listen to! Yes, the mouse coordonates are not relative to the turtle canvas, but it will be changed in the near future. after all, its W.I.P.

from sketchable import Mouse, MouseBtns

mickey_mouse = Mouse()

while True:
    if mickey_mouse.isKeyClicked(MouseBtns.MIDDLE):
        print("damn bro after 1 day it finally works(yay)")

VII - Contribuiting and reporting bugs:

You can tell me what issues Sketchable has(because i don't test it too often), by going into the issues section of GitHub. Also, you can suggest me some new ideas there too. Forking is allowed, and you can fork freely, and even merge with the main repo. But if you make your own fork, be sure to give credit.

For this project i used the folowing OSS python libaries:

  • Mouse
  • Keyboard
  • Pynput
  • Simpleaudio (so don't DMCA me)

Made with 💔- ugh i mean 💖 by Brickboss <3 Licensed over the Sketchable-MIT(PMIT) licence - This license is based on the MIT License and is intended to be compatible with it

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sketchable-1.3.8.post1.tar.gz (26.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sketchable-1.3.8.post1-py3-none-any.whl (23.6 kB view details)

Uploaded Python 3

File details

Details for the file sketchable-1.3.8.post1.tar.gz.

File metadata

  • Download URL: sketchable-1.3.8.post1.tar.gz
  • Upload date:
  • Size: 26.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for sketchable-1.3.8.post1.tar.gz
Algorithm Hash digest
SHA256 49f074fd6021147844af32ab9c5a1825730411f3c9451e123fb12b748c175035
MD5 4cdf1f906e377d298c22b7223c09aa52
BLAKE2b-256 238297cb4050f5f20953f628cb156ec19b56af11360a5cbdcc49ad1ad3b4816f

See more details on using hashes here.

File details

Details for the file sketchable-1.3.8.post1-py3-none-any.whl.

File metadata

File hashes

Hashes for sketchable-1.3.8.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 8c8047db324ef84ceaa8ac9b92faf9a5da8a5572d7f1eed18a409ff5686b2c48
MD5 e878b36630f2a956993307de1695eca8
BLAKE2b-256 d1f28d7a9eeb1756b7d9ac07c1337661bd35e4753d99f66e2085fa506bae19e9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page