Is there a way to draw a semicircle in Pygame? Something like this:

pygame.surface.set_clip() will not work for this – I need circles that look like pie slices as well, like this one:

Advertisement
Answer
PyGame has no function to create filled arc/pie but you can use PIL/pillow to generate bitmap with pieslice and convert to PyGame image to display it.
import pygame
#import pygame.gfxdraw
from PIL import Image, ImageDraw
# --- constants ---
BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
BLUE  = (  0,   0, 255)
GREEN = (  0, 255,   0)
RED   = (255,   0,   0)
GREY  = (128, 128, 128)
#PI = 3.1415
# --- main ----
pygame.init()
screen = pygame.display.set_mode((800,600))
# - generate PIL image with transparent background -
pil_size = 300
pil_image = Image.new("RGBA", (pil_size, pil_size))
pil_draw = ImageDraw.Draw(pil_image)
#pil_draw.arc((0, 0, pil_size-1, pil_size-1), 0, 270, fill=RED)
pil_draw.pieslice((0, 0, pil_size-1, pil_size-1), 330, 0, fill=GREY)
# - convert into PyGame image -
mode = pil_image.mode
size = pil_image.size
data = pil_image.tobytes()
image = pygame.image.fromstring(data, size, mode)
image_rect = image.get_rect(center=screen.get_rect().center)
# - mainloop -
clock = pygame.time.Clock()
running = True
while running:
    clock.tick(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
    screen.fill(WHITE)
    #pygame.draw.arc(screen, BLACK, (300, 200, 200, 200), 0, PI/2, 1)
    #pygame.gfxdraw.pie(screen, 400, 300, 100, 0, 90, RED)
    #pygame.gfxdraw.arc(screen, 400, 300, 100, 90, 180, GREEN)
    screen.blit(image, image_rect) # <- display image
    pygame.display.flip()
# - end -
pygame.quit()
Result:
