<p align="center">
<br>
<a href="https://github.com/Abdur-rahmaanJ/hooman"><img src="https://github.com/Abdur-rahmaanJ/hooman/raw/master/assets/hooman.png" alt="Hooman"></a>
<br>
</p>
# hooman [![Downloads](https://static.pepy.tech/badge/hooman)](https://pepy.tech/project/hooman) ![PyPI](https://img.shields.io/pypi/v/hooman)
~ pygame for humans [ [docs](https://github.com/Abdur-rahmaanJ/hooman#docs) | [gallery](https://abdur-rahmaanj.github.io/hooman/gallery) ]
Supports pygame / pygame-ce
```
pip install hooman
```
demos
```
python -m hooman.demos # see all demos
python -m hooman.demos.sliders # select one
```
join discord: https://discord.gg/Q23ATve
The package for clearer, shorter and cleaner PyGame codebases!
Featured by [r/Pygame](https://www.reddit.com/r/pygame/)
Fun fact: Codementor.io [tweeted about Hooman](https://twitter.com/CodementorIO/status/1306295790441246725?s=20) tagged #LearnPython #100DaysOfCode
# Tutorials
- [Building A Color Picker](https://dev.to/abdurrahmaanj/building-a-color-picker-in-pygame-using-hooman-307m)
- [Display most frequent words using PyGame](https://www.pythonkitchen.com/display-most-frequent-words-python-pygame/)
- [Realtime CPU monitor using PyGame](https://www.pythonkitchen.com/realtime-cpu-monitor-using-pygame/)
- [Android's Lock Screen in Pygame](https://www.codementor.io/@abdurrahmaanj/android-s-lock-screen-pattern-in-pygame-1y12ejsg3s)
# Getting Started
hooman makes developing with pygame easy by having everything in 1 object!
```python
from hooman import Hooman
hapi = Hooman(width, height)
while hapi.is_running:
hapi.flip_display()
hapi.event_loop()
```
# Playground
You can use the *[jurigged](https://github.com/breuleux/jurigged)* package to reload your code while you update your file. The latter will give you a quick visual feedback while coding.
## Example
```
jurigged hooman/hooman/demos/sketch_pad.py
```
# Contributing Notes
- **Demos**: Include your name and Github URL in a docstring at the top of the demo file
# [features](new_features.md)
- record video
- screenshot
- integrate with other pygame codes
- save to svg
- keyword argument same as dictionary
# Docs
## Attributes
## .WIDTH
- `hapi.WIDTH` is gives the width of the screen
## .HEIGHT
- `hapi.HEIGHT` is gives the height of the screen
## .is_running
- if loop is running
## .screen
still exposes a screen to draw with any pygame shape
`pygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)`
## Constants
## .PI
The value of pi as provided by the maths module
`pygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)`
## Colors, strokes & Fill
## .fill
- used for colouring next shapes
- `hapi.fill((100, 100, 100))` for r g b
- `hapi.fill(100)` same as `hapi.fill((100, 100, 100))`
## .stroke
- used to set color of next shapes' outlines
- `hapi.stroke((100, 100, 100))` for r g b
- `hapi.stroke(100)` same as `hapi.stroke((100, 100, 100))`
## .background
- used to set background color of screen
- `hapi.background((100, 100, 100))` for r g b
- `hapi.background(100)` same as `hapi.background((100, 100, 100))`
## .set_background
- used to have the background drawn every frame automatically
- `hapi.set_background((100, 100, 100))`
- same as `hapi.background((100, 100, 100))`
## .color
same as
```
{
'red': (255, 0, 0),
'green': (0, 255, 0),
'blue': (0, 0, 255),
'black': (0, 0, 0),
'white': (255, 0, 0),
'yellow': (255, 255, 0),
'grey': (100, 100, 100)
}
```
also `.colors`, `.colours`, `.colour` same
## Size
## .stroke_size
- used to control thickness of lines and outlines
- `hapi.stroke_size(size)` where size is an int
## .no_stroke
- set lines and outlines thickness to 0
- `hapi.no_stroke()`
- same as `hapi.stroke_size(0)`
## .font_size
- sets font size of text
- `hapi.font_size(12)`
## Basic elements
## .rect
`hapi.rect(x, y, width, height)`
- x - x coordinate
- y - y coordinate
## .ellipse
`hapi.ellipse(x, y, width, height)`
- x - x coordinate
- y - y coordinate
## .line
`hapi.line(x1, y1, x2, y2)`
- x1 - x coordinate of first point
- y1 - y coordinate of first point
- x2 - x coordinate of second point
- y2 - y coordinate of second point
## .text
`.text(letters, x, y)`
- letters - string of chars eg. 'abcd'
- x - x coordinate
- y - y coordinate
- will convert any type passed to string
- `hapi.text(5, 10, 10)` is valid
- `hapi.text(hapi.mouseX(), 10, 10)` is valid out of the box
## .polygon
`.polygon(coords, fill=True)`
- coords is a 2d array [(0,0), (10, 10), (10, 100)]
- if fill is `False`, only the outline will be drawn
- adjust outline with `.stroke_size`
## .begin_shape
`hapi.begin_shape()` starts drawing a polygon
## .vertex
`.vertex((100, 200))`
## .end_shape
`hapi.end_shape(fill=True)` draws polygon on closing
Minimal demo of `.begin_shape`, `.vertex` and `.end_shape`
```python
from hooman import Hooman
import pygame
hapi = Hooman(500, 500)
def handle_events(event):
if event.type == pygame.QUIT:
hapi.is_running = False
hapi.handle_events = handle_events
while hapi.is_running:
hapi.background(hapi.color['white'])
hapi.fill(hapi.color['blue'])
hapi.stroke_size(4)
hapi.begin_shape()
hapi.vertex((0, 0))
hapi.vertex((100, 0))
hapi.vertex((hapi.mouseX(), hapi.mouseY()))
hapi.end_shape()
# same as hapi.polygon([(0, 0), (100, 0), (hapi.mouseX(), hapi.mouseY())])
hapi.flip_display()
hapi.event_loop()
pygame.quit()
```
## .heart
`.heart(x, y, w, h)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
## .star
`.star(x, y, r1, r2, npoints)`
- x - x coordinate
- y - y coordinate
- r1 - radius on the x axis, same as half width
- r2 - radius on the y axis, same as half height
- npoints - the number of points of the star, this is a minimum of 2
## .curve_rect
`.curve_rect(x, y, w, h, curve)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- curve - the percentage of curve with 0 being no curve and 100 being full curve
## .arrow
`.arrow(x, y, w, h)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
## .alpha_ellipse
`.alpha_ellipse(x, y, w, h)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
## .regular_polygon
`.regular_polygon(x, y, w, h, npoints, angle_offset)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- npoints - the number of points/corners of the polygon eg. 4 is a square
- angle_offset - the first point will be drawn from the top, this moves it to θ degrees anti-clockwise
## .supershape
- note see paulbourke.net/geometry/supershape/ on how to use supershape
- there is also presets for this below
`.supershape(x, y, w, h, options)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- options - optional options for the shape
#### optional options
- n1
- n2
- n3
- m
- a
- b
- phi
## .smooth_star
note this is a preset for supershape
`.smooth_star(x, y, w, h, n1=0.20, fill=False)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- n1 - controls the smoothness of the star, this is between 0 and 1
- fill - when set to False, only the outline will be drawn
## .oil_drop
note this is a preset for supershape
`.oil_drop(x, y, w, h, n1=0.3, fill=False)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- n1 - controls the size of the drop, must be between 0 and 1
- fill - when set to False, only the outline will be drawn
## .flowing_star
note this is a preset for supershape
`.flowing_star(x, y, w, h, n1=0.3, fill=False)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- n1 - controls the inflation of the shape, must be between 0 and 1
- fill - when set to False, only the outline will be drawn
## .gradient_rect
`.gradient_rect(x, y, w, h, start_col, end_col, direction=0)`
- x - x coordinate
- y - y coordinate
- w - width
- h - height
- start_col - this is the color it starts with
- end_col - this is the color it ends with
- direction - the direction of the gradient, 0 is horizontal where it starts on the left and 1 is vertical where is starts on the top
## .cross_hair
`.cross_hair(coord)`
- coord - the x and y position of the center of the cross_hairs
## Interactivity
## .mouseX
- `hapi.mouseX()` gives the current x coordinate of the mouse
## .mouseY
- `hapi.mouseY()` gives the current y coordinate of the mouse
## Pygame specifics
## .flip_display
- is just `pygame.display.flip()` behind the scene
## .event_loop
requires
```python
def handle_events(event):
if event.type == pygame.QUIT:
hapi.is_running = False
hapi.handle_events = handle_events
```
- is put inside `hapi.is_running` loop
## .set_caption
same as `pygame.display.set_caption`
# Ui
## .update_ui
- no need to update each element if you call this
- called inside `hapi.is_running` loop
- here is when **NOT** to use it:
```python
while hapi.is_running:
for i in range(5):
x = hapi.button(10+i*80, hapi.mouseY(), "Click Me",
grey_style
)
hapi.update_ui()
```
## .button
Create a button with `hapi.button(x, y, w, h, text, [optional paramters])`
- `x` - x location of the button
- `y` - y location of the button
- `w` - width of the button
- `h` - height of the button
- `text` - the text on the button
- `[optional parameters]` - a dictionary of any extra options you want for the button listed below
#### Optional Parameters
```python
"hover_background_color": None
"outline": False
"outline_thickness": 0
"hover_outline_thickness": None
"outline_color": (0, 0, 0)
"outline_half": False
"hover_image": None
"enlarge": False
"enlarge_amount": 1.1
"calculate_size": False
"dont_generate": False
"padding_x": 0
"padding_y": 0
all options from Base Ui Widget
```
plus all parameters from [Base Widget](#Base-Widget)
```python
def on_hover_enter(btn):
btn.background_color = hapi.color['blue']
button = hapi.button(150, 250, "Click Me",
{'on_hover_enter':on_hover_enter}
)
```
#### Methods
- `update()` -> bool - this updates the button and draws it on screen, this should be called every frame, return whether the button was clicked
- `Update_text(text)` - this changes the text and recreates the button
- `create_button()` - this applies any changes to the button
## .slider
`.slider(x, y, w, h, [optional parameters])`
- `x` - x coordinate
- `y` - y coordinate
- `w` - width
- `h` - height
- optional parameters - a dictionary of optional options
#### optional parameters
```python
"slider_width": None
"slider_color": (200, 200, 200)
"starting_value": None
"range": [0, 1]
"slider_height": None
"step": 0
"direction": "horizontal"
"slider_image": None
"slider_curve": 0
```
plus all parameters from [Base Widget](#Base-Widget)
#### Methods
- `update()` -> float - this updates the slider and draws it on screen, this should be called every frame, return the value
- `value()` - this returns the current value of the slider
- `set_value(value)` - given a integer or float, this sets the value and moves the slider
## .slider_with_text
`.slider_with_text(slider, [optianl parameters])`
- `slider` - a `.slider` widget
- optional parameters - a dictionary of optional options
#### optional parameters
```python
"font": "calibri"
"font_size": 20
"font_color": (0, 0, 0)
"padding_y": 2
"padding_x": 0
"pivot": "top_left"
"accuracy": 0
```
plus all parameters from [Base Widget](#Base-Widget)
#### Methods
- `update()` - this updates the text and the given slider
- `value()` - this returns the value of the given slider
## .scroll
`.scroll([optional parameters])`
- optional parameters - a dictionary of optional options
#### optional parameters
```python
"starting_x": 0
"starting_y": 0
"range_x": 0
"range_y": 0
"bar_color": (200, 200, 200)
"slider_color": (150, 150, 150)
```
#### Methods
-`update()` - this updates the scroll widget
#### how to use the scroll
- use `scroll_widget[0]` to get the amount of horizontal scroll and
`scroll_widget[1]` to get the amount of vertical scroll
eg.
```python
scroll_obj = hapi.scroll(params)
while hapi.running:
hapi.rect(100 + scroll_obj[0], 100 + scroll_obj[1], 50, 50)
scroll_obj.update()
```
## .textbox
`.textbox(x, y, w, h=0, [optional parameters])`
- `x` - x coordinate
- `y` - y coordinate
- `w` - width
- `h` - height of each line
- optional parameters - a dictionary of optional options
#### optional parameters
```python
"max_lines": 1
"text": "" # this can be a list containg a string of each line or a single string containing '\n's
"padding_x": 2
"padding_y": 2
"cursor": True
"on_return": None
"calculate_size": False
"typing": True
```
#### Methods
- `update()` - this updates the textbox and draws it on screen, this should be called every frame
- `get_lines(lines=1, return_as_string=False)` - this returns the text in the textbox, lines can be the line number (starting from 1) or a range of lines eg. `(1,4)` gets lines 1 to 4, when return_as_string is False, it will return each line in a list
- `key_down(event)` - when a KEYDOWN event happens, giving it to this method updates the textbox
```python
def handle_events(event):
if event.type == pygame.KEYDOWN:
my_textbox.keydown(event)
```
## Base Widget
these are all optianl parameters and methods that all widgests have
#### optional parameters
```python
"background_color": (255, 255, 255)
"surface": None
"on_click": None
"on_hover": None
"on_hold": None
"on_release": None
"on_enter": None
"on_exit": None
"image": None
"curve": 0
"font_colour": (0, 0, 0)
"font": "Calibri"
"font_size": 30
"center": False
```
#### methods
- `get_rect()` -> pygame.Rect
## Charts
### .barchart
```python
params = {
"ticks_y": 10,
"tick_size": 5,
"range_y": [0, 100],
"data": {"a": 10, "b": 20},
"bin_color": (255, 99, 97),
"line_color": (200, 200, 200),
"text_color": (100, 100, 100),
"mouse_line": False,
}
hapi.barchart(x, y, w, h, params)
```
### .linechart
```python
params = {
"ticks_y": 10,
"ticks_x": 10,
"tick_size": 5,
"range_y": [0, 100],
"range_x": [0, 100],
"lines":[{
"label": "---",
"color": (255, 0, 0),
"data": [[1,1]],
"values_window": 200
}],
"labels": ["apple", "", "", "tree"],
"line_color": (200, 200, 200),
"text_color": (100, 100, 100),
"mouse_line": False,
"mouse_line_color": (255, 0, 0),
"graph_color": (0, 0, 0),
"show_axes": True,
"show_ticks_x": True,
"show_ticks_y": True,
"x_axis_label": "x_axis_label",
"y_axis_label": "y_axis_label",
"plot_background": True,
"plot_grid": True,
"plot_background_color": (234,234,242),
"plot_grid_color": 255
}
hapi.linechart(x, y, w, h, params)
```
### .scatterchart
```python
params = {
"ticks_y": 10,
"ticks_x": 10,
"tick_size": 5,
"range_y": [0, 100],
"range_x": [0, 100],
"data": {
"carat": [0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23],
"cut": ["Ideal", "Premium", "Good", "Premium", "Good", "Very Good", "Very Good", "Very Good", "Fair"],
"color": ["E", "E", "E", "I", "J", "J", "I", "H", "E", "H"],
"clarity": ["SI2", "SI1", "VS1", "VS2", "SI2", "VVS2", "VVS1", "SI1", "VS2", "VS1"],
"depth": [61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4],
"table": [55, 61, 65, 58, 58, 57, 57, 55, 61, 61],
"price": [326, 326, 327, 334, 335, 336, 336, 337, 337, 338],
"x": [3.95, 3.89, 4.05, 4.2, 4.34, 3.94, 3.95, 4.07, 3.87, 4],
"y": [3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05],
"z": [2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39]
},
"hue": None,
"hue_order": [],
"size": None,
"text_color": (100, 100, 100),
"mouse_line": False,
"mouse_line_color": (255, 0, 0),
"graph_color": (0, 0, 0),
"show_axes": True,
"show_ticks_x": True,
"show_ticks_y": True,
"x": "price",
"y": "carat",
"plot_background": True,
"plot_grid": True,
"plot_background_color": (234,234,242),
"plot_grid_color": 255,
"line_color": 200,
"strong_color": (107, 107, 255),
"light_color": (235, 235, 255),
"type": "normal",
"kind": "rect",
"hist_color": "b",
"hist_color_invert": False
}
```
Raw data
{
"_id": null,
"home_page": "https://github.com/Abdur-RahmaanJ/hooman",
"name": "hooman",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.4",
"maintainer_email": null,
"keywords": "human pygame canvas api wrapper game processing",
"author": "Abdur-Rahmaan Janhangeer",
"author_email": "arj.python@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/9c/4c/51c3bbf618751fa507abadc066af9296503a5c1536f0ac3d2ad52e1bfdb0/hooman-0.12.1.tar.gz",
"platform": null,
"description": "\n\n<p align=\"center\">\n <br>\n <a href=\"https://github.com/Abdur-rahmaanJ/hooman\"><img src=\"https://github.com/Abdur-rahmaanJ/hooman/raw/master/assets/hooman.png\" alt=\"Hooman\"></a>\n <br>\n</p>\n\n\n# hooman [![Downloads](https://static.pepy.tech/badge/hooman)](https://pepy.tech/project/hooman) ![PyPI](https://img.shields.io/pypi/v/hooman)\n\n~ pygame for humans [ [docs](https://github.com/Abdur-rahmaanJ/hooman#docs) | [gallery](https://abdur-rahmaanj.github.io/hooman/gallery) ]\n\nSupports pygame / pygame-ce\n\n```\npip install hooman\n```\n\ndemos\n\n```\npython -m hooman.demos # see all demos\npython -m hooman.demos.sliders # select one\n```\n\njoin discord: https://discord.gg/Q23ATve\n\nThe package for clearer, shorter and cleaner PyGame codebases!\n\nFeatured by [r/Pygame](https://www.reddit.com/r/pygame/)\n\nFun fact: Codementor.io [tweeted about Hooman](https://twitter.com/CodementorIO/status/1306295790441246725?s=20) tagged #LearnPython #100DaysOfCode\n\n# Tutorials\n\n- [Building A Color Picker](https://dev.to/abdurrahmaanj/building-a-color-picker-in-pygame-using-hooman-307m)\n- [Display most frequent words using PyGame](https://www.pythonkitchen.com/display-most-frequent-words-python-pygame/)\n- [Realtime CPU monitor using PyGame](https://www.pythonkitchen.com/realtime-cpu-monitor-using-pygame/)\n- [Android's Lock Screen in Pygame](https://www.codementor.io/@abdurrahmaanj/android-s-lock-screen-pattern-in-pygame-1y12ejsg3s)\n\n\n# Getting Started\n\nhooman makes developing with pygame easy by having everything in 1 object!\n\n```python\nfrom hooman import Hooman\n\nhapi = Hooman(width, height)\n\nwhile hapi.is_running:\n\n hapi.flip_display()\n hapi.event_loop()\n```\n\n# Playground\n\nYou can use the *[jurigged](https://github.com/breuleux/jurigged)* package to reload your code while you update your file. The latter will give you a quick visual feedback while coding.\n\n## Example\n\n```\njurigged hooman/hooman/demos/sketch_pad.py\n```\n# Contributing Notes\n\n- **Demos**: Include your name and Github URL in a docstring at the top of the demo file\n\n# [features](new_features.md)\n\n- record video\n- screenshot\n- integrate with other pygame codes\n- save to svg\n- keyword argument same as dictionary\n\n# Docs\n\n## Attributes\n\n## .WIDTH\n\n- `hapi.WIDTH` is gives the width of the screen\n\n## .HEIGHT\n\n- `hapi.HEIGHT` is gives the height of the screen\n\n## .is_running\n\n- if loop is running\n\n## .screen\n\nstill exposes a screen to draw with any pygame shape\n\n`pygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)`\n\n## Constants\n\n## .PI\n\nThe value of pi as provided by the maths module\n\n`pygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)`\n\n## Colors, strokes & Fill\n\n## .fill\n\n- used for colouring next shapes\n- `hapi.fill((100, 100, 100))` for r g b\n- `hapi.fill(100)` same as `hapi.fill((100, 100, 100))`\n\n## .stroke\n\n- used to set color of next shapes' outlines\n- `hapi.stroke((100, 100, 100))` for r g b\n- `hapi.stroke(100)` same as `hapi.stroke((100, 100, 100))`\n\n## .background\n\n- used to set background color of screen\n- `hapi.background((100, 100, 100))` for r g b\n- `hapi.background(100)` same as `hapi.background((100, 100, 100))`\n\n## .set_background\n\n- used to have the background drawn every frame automatically\n- `hapi.set_background((100, 100, 100))`\n- same as `hapi.background((100, 100, 100))`\n\n## .color\n\nsame as\n\n```\n{\n 'red': (255, 0, 0),\n 'green': (0, 255, 0),\n 'blue': (0, 0, 255),\n 'black': (0, 0, 0),\n 'white': (255, 0, 0),\n 'yellow': (255, 255, 0),\n 'grey': (100, 100, 100)\n}\n```\n\nalso `.colors`, `.colours`, `.colour` same\n\n## Size\n\n## .stroke_size\n\n- used to control thickness of lines and outlines\n- `hapi.stroke_size(size)` where size is an int\n\n## .no_stroke\n\n- set lines and outlines thickness to 0\n- `hapi.no_stroke()`\n- same as `hapi.stroke_size(0)`\n\n## .font_size\n\n- sets font size of text\n- `hapi.font_size(12)`\n\n## Basic elements\n\n## .rect\n\n`hapi.rect(x, y, width, height)`\n\n- x - x coordinate\n- y - y coordinate\n\n## .ellipse\n\n`hapi.ellipse(x, y, width, height)`\n\n- x - x coordinate\n- y - y coordinate\n\n## .line\n\n`hapi.line(x1, y1, x2, y2)`\n\n- x1 - x coordinate of first point\n- y1 - y coordinate of first point\n- x2 - x coordinate of second point\n- y2 - y coordinate of second point\n\n## .text\n\n`.text(letters, x, y)`\n\n- letters - string of chars eg. 'abcd'\n- x - x coordinate\n- y - y coordinate\n- will convert any type passed to string\n- `hapi.text(5, 10, 10)` is valid\n- `hapi.text(hapi.mouseX(), 10, 10)` is valid out of the box\n\n## .polygon\n\n`.polygon(coords, fill=True)`\n\n- coords is a 2d array [(0,0), (10, 10), (10, 100)]\n- if fill is `False`, only the outline will be drawn\n- adjust outline with `.stroke_size`\n\n## .begin_shape\n\n`hapi.begin_shape()` starts drawing a polygon\n\n## .vertex\n\n`.vertex((100, 200))`\n\n## .end_shape\n\n`hapi.end_shape(fill=True)` draws polygon on closing\n\nMinimal demo of `.begin_shape`, `.vertex` and `.end_shape`\n\n```python\nfrom hooman import Hooman\n\nimport pygame\n\nhapi = Hooman(500, 500)\n\ndef handle_events(event):\n if event.type == pygame.QUIT:\n hapi.is_running = False\n\nhapi.handle_events = handle_events\n\nwhile hapi.is_running:\n hapi.background(hapi.color['white'])\n\n hapi.fill(hapi.color['blue'])\n hapi.stroke_size(4)\n\n hapi.begin_shape()\n hapi.vertex((0, 0))\n hapi.vertex((100, 0))\n hapi.vertex((hapi.mouseX(), hapi.mouseY()))\n hapi.end_shape()\n\n # same as hapi.polygon([(0, 0), (100, 0), (hapi.mouseX(), hapi.mouseY())])\n\n hapi.flip_display()\n hapi.event_loop()\n\npygame.quit()\n\n```\n\n## .heart\n\n`.heart(x, y, w, h)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n\n## .star\n\n`.star(x, y, r1, r2, npoints)`\n\n- x - x coordinate\n- y - y coordinate\n- r1 - radius on the x axis, same as half width\n- r2 - radius on the y axis, same as half height\n- npoints - the number of points of the star, this is a minimum of 2\n\n## .curve_rect\n\n`.curve_rect(x, y, w, h, curve)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- curve - the percentage of curve with 0 being no curve and 100 being full curve\n\n## .arrow\n\n`.arrow(x, y, w, h)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n\n## .alpha_ellipse\n\n`.alpha_ellipse(x, y, w, h)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n\n## .regular_polygon\n\n`.regular_polygon(x, y, w, h, npoints, angle_offset)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- npoints - the number of points/corners of the polygon eg. 4 is a square\n- angle_offset - the first point will be drawn from the top, this moves it to \u03b8 degrees anti-clockwise\n\n## .supershape\n\n- note see paulbourke.net/geometry/supershape/ on how to use supershape\n- there is also presets for this below\n\n`.supershape(x, y, w, h, options)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- options - optional options for the shape\n\n#### optional options\n\n- n1\n- n2\n- n3\n- m\n- a\n- b\n- phi\n\n## .smooth_star\n\nnote this is a preset for supershape\n\n`.smooth_star(x, y, w, h, n1=0.20, fill=False)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- n1 - controls the smoothness of the star, this is between 0 and 1\n- fill - when set to False, only the outline will be drawn\n\n## .oil_drop\n\nnote this is a preset for supershape\n\n`.oil_drop(x, y, w, h, n1=0.3, fill=False)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- n1 - controls the size of the drop, must be between 0 and 1\n- fill - when set to False, only the outline will be drawn\n\n## .flowing_star\n\nnote this is a preset for supershape\n\n`.flowing_star(x, y, w, h, n1=0.3, fill=False)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- n1 - controls the inflation of the shape, must be between 0 and 1\n- fill - when set to False, only the outline will be drawn\n\n## .gradient_rect\n\n`.gradient_rect(x, y, w, h, start_col, end_col, direction=0)`\n\n- x - x coordinate\n- y - y coordinate\n- w - width\n- h - height\n- start_col - this is the color it starts with\n- end_col - this is the color it ends with\n- direction - the direction of the gradient, 0 is horizontal where it starts on the left and 1 is vertical where is starts on the top\n\n## .cross_hair\n\n`.cross_hair(coord)`\n\n- coord - the x and y position of the center of the cross_hairs\n\n## Interactivity\n\n## .mouseX\n\n- `hapi.mouseX()` gives the current x coordinate of the mouse\n\n## .mouseY\n\n- `hapi.mouseY()` gives the current y coordinate of the mouse\n\n## Pygame specifics\n\n## .flip_display\n\n- is just `pygame.display.flip()` behind the scene\n\n## .event_loop\n\nrequires\n\n```python\ndef handle_events(event):\n if event.type == pygame.QUIT:\n hapi.is_running = False\n\nhapi.handle_events = handle_events\n```\n\n- is put inside `hapi.is_running` loop\n\n## .set_caption\n\nsame as `pygame.display.set_caption`\n\n# Ui\n\n## .update_ui\n\n- no need to update each element if you call this\n- called inside `hapi.is_running` loop\n- here is when **NOT** to use it:\n\n```python\nwhile hapi.is_running:\n for i in range(5):\n x = hapi.button(10+i*80, hapi.mouseY(), \"Click Me\",\n grey_style\n )\n hapi.update_ui()\n```\n\n\n## .button\n\nCreate a button with `hapi.button(x, y, w, h, text, [optional paramters])`\n\n- `x` - x location of the button\n- `y` - y location of the button\n- `w` - width of the button\n- `h` - height of the button\n- `text` - the text on the button\n- `[optional parameters]` - a dictionary of any extra options you want for the button listed below\n\n#### Optional Parameters\n```python\n \"hover_background_color\": None\n \"outline\": False\n \"outline_thickness\": 0\n \"hover_outline_thickness\": None\n \"outline_color\": (0, 0, 0)\n \"outline_half\": False\n \"hover_image\": None\n \"enlarge\": False\n \"enlarge_amount\": 1.1\n \"calculate_size\": False\n \"dont_generate\": False\n \"padding_x\": 0\n \"padding_y\": 0\n all options from Base Ui Widget\n```\nplus all parameters from [Base Widget](#Base-Widget)\n\n\n```python\ndef on_hover_enter(btn):\n btn.background_color = hapi.color['blue']\n\nbutton = hapi.button(150, 250, \"Click Me\",\n {'on_hover_enter':on_hover_enter}\n )\n```\n\n#### Methods\n\n- `update()` -> bool - this updates the button and draws it on screen, this should be called every frame, return whether the button was clicked\n- `Update_text(text)` - this changes the text and recreates the button\n- `create_button()` - this applies any changes to the button\n\n## .slider\n\n`.slider(x, y, w, h, [optional parameters])`\n\n- `x` - x coordinate\n- `y` - y coordinate\n- `w` - width\n- `h` - height\n- optional parameters - a dictionary of optional options\n\n#### optional parameters\n```python\n \"slider_width\": None\n \"slider_color\": (200, 200, 200)\n \"starting_value\": None\n \"range\": [0, 1]\n \"slider_height\": None\n \"step\": 0\n \"direction\": \"horizontal\"\n \"slider_image\": None\n \"slider_curve\": 0\n```\nplus all parameters from [Base Widget](#Base-Widget)\n#### Methods\n\n- `update()` -> float - this updates the slider and draws it on screen, this should be called every frame, return the value\n- `value()` - this returns the current value of the slider\n- `set_value(value)` - given a integer or float, this sets the value and moves the slider\n\n## .slider_with_text\n\n`.slider_with_text(slider, [optianl parameters])`\n\n- `slider` - a `.slider` widget\n- optional parameters - a dictionary of optional options\n\n#### optional parameters\n```python\n \"font\": \"calibri\"\n \"font_size\": 20\n \"font_color\": (0, 0, 0)\n \"padding_y\": 2\n \"padding_x\": 0\n \"pivot\": \"top_left\"\n \"accuracy\": 0\n```\nplus all parameters from [Base Widget](#Base-Widget)\n#### Methods\n\n- `update()` - this updates the text and the given slider\n- `value()` - this returns the value of the given slider\n\n## .scroll\n\n`.scroll([optional parameters])`\n\n- optional parameters - a dictionary of optional options\n\n#### optional parameters\n```python\n \"starting_x\": 0\n \"starting_y\": 0\n \"range_x\": 0\n \"range_y\": 0\n \"bar_color\": (200, 200, 200)\n \"slider_color\": (150, 150, 150)\n```\n#### Methods\n\n-`update()` - this updates the scroll widget\n\n#### how to use the scroll\n\n- use `scroll_widget[0]` to get the amount of horizontal scroll and\n`scroll_widget[1]` to get the amount of vertical scroll\n\neg.\n```python\nscroll_obj = hapi.scroll(params)\n\nwhile hapi.running:\n hapi.rect(100 + scroll_obj[0], 100 + scroll_obj[1], 50, 50)\n scroll_obj.update()\n```\n\n\n## .textbox\n\n`.textbox(x, y, w, h=0, [optional parameters])`\n\n- `x` - x coordinate\n- `y` - y coordinate\n- `w` - width\n- `h` - height of each line\n- optional parameters - a dictionary of optional options\n\n#### optional parameters\n\n```python\n \"max_lines\": 1\n \"text\": \"\" # this can be a list containg a string of each line or a single string containing '\\n's\n \"padding_x\": 2\n \"padding_y\": 2\n \"cursor\": True\n \"on_return\": None\n \"calculate_size\": False\n \"typing\": True\n```\n#### Methods\n\n- `update()` - this updates the textbox and draws it on screen, this should be called every frame\n- `get_lines(lines=1, return_as_string=False)` - this returns the text in the textbox, lines can be the line number (starting from 1) or a range of lines eg. `(1,4)` gets lines 1 to 4, when return_as_string is False, it will return each line in a list\n- `key_down(event)` - when a KEYDOWN event happens, giving it to this method updates the textbox\n\n```python\ndef handle_events(event):\n if event.type == pygame.KEYDOWN:\n my_textbox.keydown(event)\n```\n\n## Base Widget\nthese are all optianl parameters and methods that all widgests have\n\n#### optional parameters\n\n```python\n \"background_color\": (255, 255, 255)\n \"surface\": None\n \"on_click\": None\n \"on_hover\": None\n \"on_hold\": None\n \"on_release\": None\n \"on_enter\": None\n \"on_exit\": None\n \"image\": None\n \"curve\": 0\n \"font_colour\": (0, 0, 0)\n \"font\": \"Calibri\"\n \"font_size\": 30\n \"center\": False\n```\n#### methods\n\n- `get_rect()` -> pygame.Rect\n\n## Charts\n\n### .barchart\n\n```python\nparams = {\n \"ticks_y\": 10,\n \"tick_size\": 5,\n \"range_y\": [0, 100],\n \"data\": {\"a\": 10, \"b\": 20},\n \"bin_color\": (255, 99, 97),\n \"line_color\": (200, 200, 200),\n \"text_color\": (100, 100, 100),\n \"mouse_line\": False,\n }\nhapi.barchart(x, y, w, h, params)\n```\n\n\n### .linechart\n\n```python\nparams = {\n \"ticks_y\": 10,\n \"ticks_x\": 10,\n \"tick_size\": 5,\n \"range_y\": [0, 100],\n \"range_x\": [0, 100],\n \"lines\":[{\n \"label\": \"---\",\n \"color\": (255, 0, 0),\n \"data\": [[1,1]],\n \"values_window\": 200\n }],\n \"labels\": [\"apple\", \"\", \"\", \"tree\"],\n \"line_color\": (200, 200, 200),\n \"text_color\": (100, 100, 100),\n \"mouse_line\": False,\n \"mouse_line_color\": (255, 0, 0),\n \"graph_color\": (0, 0, 0),\n \"show_axes\": True,\n \"show_ticks_x\": True,\n \"show_ticks_y\": True,\n \"x_axis_label\": \"x_axis_label\",\n \"y_axis_label\": \"y_axis_label\",\n \"plot_background\": True,\n \"plot_grid\": True,\n \"plot_background_color\": (234,234,242),\n \"plot_grid_color\": 255\n }\nhapi.linechart(x, y, w, h, params)\n```\n\n\n### .scatterchart\n\n```python\nparams = {\n \"ticks_y\": 10,\n \"ticks_x\": 10,\n \"tick_size\": 5,\n \"range_y\": [0, 100],\n \"range_x\": [0, 100],\n \"data\": {\n \"carat\": [0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23], \n \"cut\": [\"Ideal\", \"Premium\", \"Good\", \"Premium\", \"Good\", \"Very Good\", \"Very Good\", \"Very Good\", \"Fair\"],\n \"color\": [\"E\", \"E\", \"E\", \"I\", \"J\", \"J\", \"I\", \"H\", \"E\", \"H\"],\n \"clarity\": [\"SI2\", \"SI1\", \"VS1\", \"VS2\", \"SI2\", \"VVS2\", \"VVS1\", \"SI1\", \"VS2\", \"VS1\"],\n \"depth\": [61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4],\n \"table\": [55, 61, 65, 58, 58, 57, 57, 55, 61, 61],\n \"price\": [326, 326, 327, 334, 335, 336, 336, 337, 337, 338],\n \"x\": [3.95, 3.89, 4.05, 4.2, 4.34, 3.94, 3.95, 4.07, 3.87, 4],\n \"y\": [3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05],\n \"z\": [2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39]\n },\n \"hue\": None,\n \"hue_order\": [],\n \"size\": None,\n \"text_color\": (100, 100, 100),\n \"mouse_line\": False,\n \"mouse_line_color\": (255, 0, 0),\n \"graph_color\": (0, 0, 0),\n \"show_axes\": True,\n \"show_ticks_x\": True,\n \"show_ticks_y\": True,\n \"x\": \"price\",\n \"y\": \"carat\",\n \"plot_background\": True,\n \"plot_grid\": True,\n \"plot_background_color\": (234,234,242),\n \"plot_grid_color\": 255,\n \"line_color\": 200,\n \"strong_color\": (107, 107, 255),\n \"light_color\": (235, 235, 255),\n \"type\": \"normal\",\n \"kind\": \"rect\",\n \"hist_color\": \"b\",\n \"hist_color_invert\": False\n }\n\n```\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Pygame for humans",
"version": "0.12.1",
"project_urls": {
"Bug Reports": "https://github.com/Abdur-RahmaanJ/hooman/issues",
"Homepage": "https://github.com/Abdur-RahmaanJ/hooman",
"Source": "https://github.com/Abdur-RahmaanJ/hooman/"
},
"split_keywords": [
"human",
"pygame",
"canvas",
"api",
"wrapper",
"game",
"processing"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b9aa746dee94503fc3423ec80c943d52cc15e9f0236119ff81c5e9523ca45416",
"md5": "9f6fb2edada5914b8536717851923991",
"sha256": "5454a5b1481f088eca82349696ee6c24e7605ed890902b1826b6bcca77b443cc"
},
"downloads": -1,
"filename": "hooman-0.12.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9f6fb2edada5914b8536717851923991",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.4",
"size": 32673,
"upload_time": "2024-10-27T21:09:51",
"upload_time_iso_8601": "2024-10-27T21:09:51.022967Z",
"url": "https://files.pythonhosted.org/packages/b9/aa/746dee94503fc3423ec80c943d52cc15e9f0236119ff81c5e9523ca45416/hooman-0.12.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9c4c51c3bbf618751fa507abadc066af9296503a5c1536f0ac3d2ad52e1bfdb0",
"md5": "c4efb024b59c44b3ddbaeadfed3be46f",
"sha256": "42e076a4d4d61adf4cff1ce3b00e696c266278a516870ad512c9d339dbbc437c"
},
"downloads": -1,
"filename": "hooman-0.12.1.tar.gz",
"has_sig": false,
"md5_digest": "c4efb024b59c44b3ddbaeadfed3be46f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.4",
"size": 36068,
"upload_time": "2024-10-27T21:09:52",
"upload_time_iso_8601": "2024-10-27T21:09:52.261717Z",
"url": "https://files.pythonhosted.org/packages/9c/4c/51c3bbf618751fa507abadc066af9296503a5c1536f0ac3d2ad52e1bfdb0/hooman-0.12.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-27 21:09:52",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Abdur-RahmaanJ",
"github_project": "hooman",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "hooman"
}