Package: hooman
hooman~ pygame for humans [docs|gallery]pip install hoomandemospython -m hooman.demos # see all demos
python -m hooman.demos.sliders # select onejoin discord:https://discord.gg/Q23ATveThe package for clearer, shorter and cleaner PyGame codebases!Featured byr/PygameFun fact: Codementor.iotweeted about Hoomantagged #LearnPython #100DaysOfCodeTutorialsBuilding A Color PickerDisplay most frequent words using PyGameRealtime CPU monitor using PyGameAndroid's Lock Screen in PygameGetting Startedhooman makes developing with pygame easy by having everything in 1 object!fromhoomanimportHoomanhapi=Hooman(width,height)whilehapi.is_running:hapi.flip_display()hapi.event_loop()PlaygroundYou can use thejuriggedpackage to reload your code while you update your file. The latter will give you a quick visual feedback while coding.Examplejurigged hooman/hooman/demos/sketch_pad.pyContributing NotesDemos: Include your name and Github URL in a docstring at the top of the demo filefeaturesrecord videoscreenshotintegrate with other pygame codessave to svgkeyword argument same as dictionaryDocsAttributes.WIDTHhapi.WIDTHis gives the width of the screen.HEIGHThapi.HEIGHTis gives the height of the screen.is_runningif loop is running.screenstill exposes a screen to draw with any pygame shapepygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)Constants.PIThe value of pi as provided by the maths modulepygame.draw.arc(hapi.screen, (255, 0, 0), [80,10,200,200], hapi.PI, hapi.PI/2, 2)Colors, strokes & Fill.fillused for colouring next shapeshapi.fill((100, 100, 100))for r g bhapi.fill(100)same ashapi.fill((100, 100, 100)).strokeused to set color of next shapes' outlineshapi.stroke((100, 100, 100))for r g bhapi.stroke(100)same ashapi.stroke((100, 100, 100)).backgroundused to set background color of screenhapi.background((100, 100, 100))for r g bhapi.background(100)same ashapi.background((100, 100, 100)).set_backgroundused to have the background drawn every frame automaticallyhapi.set_background((100, 100, 100))same ashapi.background((100, 100, 100)).colorsame 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,.coloursameSize.stroke_sizeused to control thickness of lines and outlineshapi.stroke_size(size)where size is an int.no_strokeset lines and outlines thickness to 0hapi.no_stroke()same ashapi.stroke_size(0).font_sizesets font size of texthapi.font_size(12)Basic elements.recthapi.rect(x, y, width, height)x - x coordinatey - y coordinate.ellipsehapi.ellipse(x, y, width, height)x - x coordinatey - y coordinate.linehapi.line(x1, y1, x2, y2)x1 - x coordinate of first pointy1 - y coordinate of first pointx2 - x coordinate of second pointy2 - y coordinate of second point.text.text(letters, x, y)letters - string of chars eg. 'abcd'x - x coordinatey - y coordinatewill convert any type passed to stringhapi.text(5, 10, 10)is validhapi.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 isFalse, only the outline will be drawnadjust outline with.stroke_size.begin_shapehapi.begin_shape()starts drawing a polygon.vertex.vertex((100, 200)).end_shapehapi.end_shape(fill=True)draws polygon on closingMinimal demo of.begin_shape,.vertexand.end_shapefromhoomanimportHoomanimportpygamehapi=Hooman(500,500)defhandle_events(event):ifevent.type==pygame.QUIT:hapi.is_running=Falsehapi.handle_events=handle_eventswhilehapi.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 coordinatey - y coordinatew - widthh - height.star.star(x, y, r1, r2, npoints)x - x coordinatey - y coordinater1 - radius on the x axis, same as half widthr2 - radius on the y axis, same as half heightnpoints - the number of points of the star, this is a minimum of 2.curve_rect.curve_rect(x, y, w, h, curve)x - x coordinatey - y coordinatew - widthh - heightcurve - the percentage of curve with 0 being no curve and 100 being full curve.arrow.arrow(x, y, w, h)x - x coordinatey - y coordinatew - widthh - height.alpha_ellipse.alpha_ellipse(x, y, w, h)x - x coordinatey - y coordinatew - widthh - height.regular_polygon.regular_polygon(x, y, w, h, npoints, angle_offset)x - x coordinatey - y coordinatew - widthh - heightnpoints - the number of points/corners of the polygon eg. 4 is a squareangle_offset - the first point will be drawn from the top, this moves it to θ degrees anti-clockwise.supershapenote see paulbourke.net/geometry/supershape/ on how to use supershapethere is also presets for this below.supershape(x, y, w, h, options)x - x coordinatey - y coordinatew - widthh - heightoptions - optional options for the shapeoptional optionsn1n2n3mabphi.smooth_starnote this is a preset for supershape.smooth_star(x, y, w, h, n1=0.20, fill=False)x - x coordinatey - y coordinatew - widthh - heightn1 - controls the smoothness of the star, this is between 0 and 1fill - when set to False, only the outline will be drawn.oil_dropnote this is a preset for supershape.oil_drop(x, y, w, h, n1=0.3, fill=False)x - x coordinatey - y coordinatew - widthh - heightn1 - controls the size of the drop, must be between 0 and 1fill - when set to False, only the outline will be drawn.flowing_starnote this is a preset for supershape.flowing_star(x, y, w, h, n1=0.3, fill=False)x - x coordinatey - y coordinatew - widthh - heightn1 - controls the inflation of the shape, must be between 0 and 1fill - 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 coordinatey - y coordinatew - widthh - heightstart_col - this is the color it starts withend_col - this is the color it ends withdirection - 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_hairsInteractivity.mouseXhapi.mouseX()gives the current x coordinate of the mouse.mouseYhapi.mouseY()gives the current y coordinate of the mousePygame specifics.flip_displayis justpygame.display.flip()behind the scene.event_looprequiresdefhandle_events(event):ifevent.type==pygame.QUIT:hapi.is_running=Falsehapi.handle_events=handle_eventsis put insidehapi.is_runningloop.set_captionsame aspygame.display.set_captionUi.update_uino need to update each element if you call thiscalled insidehapi.is_runningloophere is whenNOTto use it:whilehapi.is_running:foriinrange(5):x=hapi.button(10+i*80,hapi.mouseY(),"Click Me",grey_style)hapi.update_ui().buttonCreate a button withhapi.button(x, y, w, h, text, [optional paramters])x- x location of the buttony- y location of the buttonw- width of the buttonh- height of the buttontext- the text on the button[optional parameters]- a dictionary of any extra options you want for the button listed belowOptional Parameters"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":0alloptionsfromBaseUiWidgetplus all parameters fromBase Widgetdefon_hover_enter(btn):btn.background_color=hapi.color['blue']button=hapi.button(150,250,"Click Me",{'on_hover_enter':on_hover_enter})Methodsupdate()-> bool - this updates the button and draws it on screen, this should be called every frame, return whether the button was clickedUpdate_text(text)- this changes the text and recreates the buttoncreate_button()- this applies any changes to the button.slider.slider(x, y, w, h, [optional parameters])x- x coordinatey- y coordinatew- widthh- heightoptional parameters - a dictionary of optional optionsoptional parameters"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":0plus all parameters fromBase WidgetMethodsupdate()-> float - this updates the slider and draws it on screen, this should be called every frame, return the valuevalue()- this returns the current value of the sliderset_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.sliderwidgetoptional parameters - a dictionary of optional optionsoptional parameters"font":"calibri""font_size":20"font_color":(0,0,0)"padding_y":2"padding_x":0"pivot":"top_left""accuracy":0plus all parameters fromBase WidgetMethodsupdate()- this updates the text and the given slidervalue()- this returns the value of the given slider.scroll.scroll([optional parameters])optional parameters - a dictionary of optional optionsoptional parameters"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 widgethow to use the scrollusescroll_widget[0]to get the amount of horizontal scroll andscroll_widget[1]to get the amount of vertical scrolleg.scroll_obj=hapi.scroll(params)whilehapi.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 coordinatey- y coordinatew- widthh- height of each lineoptional parameters - a dictionary of optional optionsoptional parameters"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":TrueMethodsupdate()- this updates the textbox and draws it on screen, this should be called every frameget_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 listkey_down(event)- when a KEYDOWN event happens, giving it to this method updates the textboxdefhandle_events(event):ifevent.type==pygame.KEYDOWN:my_textbox.keydown(event)Base Widgetthese are all optianl parameters and methods that all widgests haveoptional parameters"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":Falsemethodsget_rect()-> pygame.RectCharts.barchartparams={"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).linechartparams={"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).scatterchartparams={"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}