¿Cómo crear un clon de MS Paint con Python y PyGame?

En este artículo, crearemos un programa de pintura de MS simple con Python y PyGame.

MS Paint es un programa simple hecho por Microsoft, permite a los usuarios crear arte y pintura básicos. Desde sus inicios, MS Paint se ha incluido en todas las versiones de Microsoft Windows. MS Paint proporciona funciones para dibujar y pintar en color y herramientas para crear diseños geométricos. En esta sección, intentaremos hacer una copia simple de una pintura de MS con la ayuda de un módulo de python como Pygame, random y os. estos módulos nos ayudarán a hacer nuestro lienzo simple. Antes de continuar, discutiremos algunos conceptos básicos de estos módulos:

  • Pygame :   Consiste en gráficos por computadora. Pygame es un conjunto de módulos de Python de código abierto. Y como sugiere el nombre, se puede usar para crear juegos. Puede codificar los juegos y luego usar comandos específicos para convertirlos en un archivo ejecutable que puede compartir con sus amigos para mostrarles el trabajo que ha estado haciendo. Incluye bibliotecas de gráficos y sonido diseñadas para usar con el lenguaje de programación Python.
  • os : este módulo se utiliza para interactuar con el sistema operativo.  Este es un módulo preinstalado. El módulo OS en Python proporciona funciones para interactuar con el sistema operativo. OS viene bajo los módulos de utilidad estándar de Python.
  • aleatorio : este módulo se utiliza para generar números aleatorios. Este es un módulo preinstalado. El módulo Python Random es un módulo integrado de Python que se utiliza para generar números aleatorios. Estos son números pseudoaleatorios, lo que significa que no son realmente aleatorios. Este módulo se puede usar para realizar acciones aleatorias, como generar números aleatorios, imprimir un valor aleatorio para una lista o string, etc.

Paquetes requeridos

pip install pygame

Ejemplo 1: hacer una aplicación de pintura simple usando Python

En este ejemplo, crearemos un lienzo en el que podemos dibujar una línea de colores cada vez que presionamos la tecla del mouse. Cada vez que soltemos el clic del mouse, elegirá un color aleatorio diferente con la ayuda de un módulo aleatorio. si el usuario hace doble clic, se cambia el color del pincel. 
En el código, la función redonda toma como argumento el tamaño de la pantalla, el color del pincel, la posición inicial y final del eje y el radio del pincel. con la ayuda de estos argumentos, dibujaremos una línea colorida.

Python3

import pygame
import random
 
# Making canvas
screen = pygame.display.set_mode((900, 700))
 
# Setting Title
pygame.display.set_caption('GFG Paint')
 
 
draw_on = False
last_pos = (0, 0)
 
# Radius of the Brush
radius = 5
 
 
def roundline(canvas, color, start, end, radius=1):
    Xaxis = end[0]-start[0]
    Yaxis = end[1]-start[1]
    dist = max(abs(Xaxis), abs(Yaxis))
    for i in range(dist):
        x = int(start[0]+float(i)/dist*Xaxis)
        y = int(start[1]+float(i)/dist*Yaxis)
        pygame.draw.circle(canvas, color, (x, y), radius)
 
 
try:
    while True:
        e = pygame.event.wait()
         
        if e.type == pygame.QUIT:
            raise StopIteration
             
        if e.type == pygame.MOUSEBUTTONDOWN:         
            # Selecting random Color Code
            color = (random.randrange(256), random.randrange(
                256), random.randrange(256))
            # Draw a single circle wheneven mouse is clicked down.
            pygame.draw.circle(screen, color, e.pos, radius)
            draw_on = True
        # When mouse button released it will stop drawing   
        if e.type == pygame.MOUSEBUTTONUP:
            draw_on = False
        # It will draw a continuous circle with the help of roundline function.   
        if e.type == pygame.MOUSEMOTION:
            if draw_on:
                pygame.draw.circle(screen, color, e.pos, radius)
                roundline(screen, color, e.pos, last_pos,  radius)
            last_pos = e.pos
        pygame.display.flip()
 
except StopIteration:
    pass
   
# Quit
pygame.quit()

Producción:

 

Ejemplo 2: Hacer una aplicación de pintura para dibujar y borrar en Canvas

En este ejemplo, hicimos un lienzo para dibujar con ocho colores diferentes para pintar. También incluye características como un botón claro que borrará la pantalla y nos dará un nuevo lienzo para dibujar, y un botón + y – que aumenta o disminuye el tamaño del pincel. Además, también incluye un reloj temporizador para practicar la pintura en un intervalo de tiempo determinado. 

Python3

# import library
import pygame 
import random
 
pygame.init()
 
# Setting window size
win_x = 500
win_y = 500
 
win = pygame.display.set_mode((win_x, win_y))
pygame.display.set_caption('Paint')
 
# Class for drawing
class drawing(object):
 
    def __init__(self):
        '''constructor'''
        self.color = (0, 0, 0)
        self.width = 10
        self.height = 10
        self.rad = 6
        self.tick = 0
        self.time = 0
        self.play = False
         
    # Drawing Function
    def draw(self, win, pos):
        pygame.draw.circle(win, self.color, (pos[0], pos[1]), self.rad)
        if self.color == (255, 255, 255):
            pygame.draw.circle(win, self.color, (pos[0], pos[1]), 20)
 
    # detecting clicks
    def click(self, win, list, list2):
        pos = pygame.mouse.get_pos()  # Localização do mouse
 
        if pygame.mouse.get_pressed() == (1, 0, 0) and pos[0] < 400:
            if pos[1] > 25:
                self.draw(win, pos)
        elif pygame.mouse.get_pressed() == (1, 0, 0):
            for button in list:
                if pos[0] > button.x and pos[0] < button.x + button.width:
                    if pos[1] > button.y and pos[1] < button.y + button.height:
                        self.color = button.color2
            for button in list2:
                if pos[0] > button.x and pos[0] < button.x + button.width:
                    if pos[1] > button.y and pos[1] < button.y + button.height:
                        if self.tick == 0:
                            if button.action == 1:
                                win.fill((255, 255, 255))
                                self.tick += 1
                            if button.action == 2 and self.rad > 4:
                                self.rad -= 1
                                self.tick += 1
                                pygame.draw.rect(
                                    win, (255, 255, 255), (410, 308, 80, 35))
 
                            if button.action == 3 and self.rad < 20:
                                self.rad += 1
                                self.tick += 1
                                pygame.draw.rect(
                                    win, (255, 255, 255), (410, 308, 80, 35))
 
                            if button.action == 5 and self.play == False:
                                self.play = True
                                game()
                                self.time += 1
                            if button.action == 6:
                                self.play = False
                                self.time = 0
 
        for button in list2:
            if button.action == 4:
                button.text = str(self.rad)
 
            if button.action == 7 and self.play == True:
                button.text = str(40 - (player1.time // 100))
            if button.action == 7 and self.play == False:
                button.text = 'Time'
 
# Class for buttons
class button(object):
 
    def __init__(self, x, y, width, height, color, color2, outline=0, action=0, text=''):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.outline = outline
        self.color2 = color2
        self.action = action
        self.text = text
         
# Class for drawing buttons
    def draw(self, win):
 
        pygame.draw.rect(win, self.color, (self.x, self.y,
                                           self.width, self.height), self.outline)
        font = pygame.font.SysFont('comicsans', 30)
        text = font.render(self.text, 1, self.color2)
        pygame.draw.rect(win, (255, 255, 255), (410, 446, 80, 35))
        # pygame.draw.rect(win, (255, 255, 255), (410, 308, 80, 35))
        win.blit(text, (int(self.x+self.width/2-text.get_width()/2),
                        int(self.y+self.height/2-text.get_height()/2)))
 
 
def drawHeader(win):
    # Drawing header space
    pygame.draw.rect(win, (175, 171, 171), (0, 0, 500, 25))
    pygame.draw.rect(win, (0, 0, 0), (0, 0, 400, 25), 2)
    pygame.draw.rect(win, (0, 0, 0), (400, 0, 100, 25), 2)
 
    # Printing header
    font = pygame.font.SysFont('comicsans', 30)
 
    canvasText = font.render('Canvas', 1, (0, 0, 0))
    win.blit(canvasText, (int(200 - canvasText.get_width() / 2),
                          int(26 / 2 - canvasText.get_height() / 2) + 2))
 
    toolsText = font.render('Tools', 1, (0, 0, 0))
    win.blit(toolsText, (int(450 - toolsText.get_width() / 2),
                         int(26 / 2 - toolsText.get_height() / 2 + 2)))
 
 
def draw(win):
    player1.click(win, Buttons_color, Buttons_other)
 
    pygame.draw.rect(win, (0, 0, 0), (400, 0, 100, 500),
                     2)  # Drawing button space
    pygame.draw.rect(win, (255, 255, 255), (400, 0, 100, 500),)
    pygame.draw.rect(win, (0, 0, 0), (0, 0, 400, 500),
                     2)  # Drawing canvas space
    drawHeader(win)
 
    for button in Buttons_color:
        button.draw(win)
 
    for button in Buttons_other:
        button.draw(win)
 
    pygame.display.update()
 
 
def main_loop():
    run = True
    while run:
        keys = pygame.key.get_pressed() 
        for event in pygame.event.get():
            if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
                run = False
 
        draw(win)
 
        if 0 < player1.tick < 40:
            player1.tick += 1
        else:
            player1.tick = 0
 
        if 0 < player1.time < 4001:
            player1.time += 1
        elif 4000 < player1.time < 4004:
            gameOver()
            player1.time = 4009
        else:
            player1.time = 0
            player1.play = False
 
    pygame.quit()
 
 
def game():
    object = ['Casa', 'cachoro', 'caneta', 'bola de futebol', 'caneca', 'Computador',
              'Chocolate', 'Jesus', 'Celular', 'Iphone', 'Teclado(instrumento)', 'teclado(computador)']
 
    font = pygame.font.SysFont('comicsans', 40)
    font2 = pygame.font.SysFont('comicsans', 25)
    text = font.render('Sua Palavra é: ' +
                       object[random.randint(0, (len(object) - 1))], 1, (255, 0, 0))
    Aviso = font2.render('Somente deve olhar essa tela a pessoa que vai desenhar:', 1,
                         (255, 0, 0))
    Aviso2 = font.render('Agora pode olhar', 1,
                         (255, 0, 0))
    i = 0
    time = 1500
    while i < 1500:
        pygame.time.delay(10)
        i += 1
        icount = int((1500/100) - (i // 100))
        time = font.render(str(icount), 1, (255, 0, 0))
        win.fill((255, 255, 255))
        if int(icount) > 10:
            win.blit(Aviso, (int(5), int(250 - Aviso.get_height() / 2)))
        elif 5 < int(icount) < 11:
            win.blit(Aviso, (int(5), int(100 - text.get_height() / 2)))
            win.blit(text, (int(250 - text.get_width() / 2),
                            int(250 - text.get_height() / 2)))
        else:
            win.blit(Aviso2, (int(250 - Aviso2.get_width() / 2),
                              int(250 - Aviso2.get_height() / 2)))
 
        win.blit(time, (int(250 - time.get_width() / 2), 270))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                i = 1001
                pygame.quit()
    win.fill((255, 255, 255))
 
# Ending Function
def gameOver():
    font = pygame.font.SysFont('comicsans', 40)
    text = font.render('GAME OVER', 1, (255, 0, 0))
    i = 0
    while i < 700:
        pygame.time.delay(10)
        i += 1
 
        win.fill((255, 255, 255))
        win.blit(text, (int(250 - text.get_width() / 2),
                        250 - text.get_height() / 2))
        pygame.display.update()
        print(7 - (i // 100))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                i = 1001
                pygame.quit()
    win.fill((255, 255, 255))
 
 
player1 = drawing()
# Fill colored to our paint
win.fill((255, 255, 255))
pos = (0, 0)
 
# Defining color buttons
redButton = button(453, 30, 40, 40, (255, 0, 0), (255, 0, 0))
blueButton = button(407, 30, 40, 40, (0, 0, 255), (0, 0, 255))
greenButton = button(407, 76, 40, 40, (0, 255, 0), (0, 255, 0))
orangeButton = button(453, 76, 40, 40, (255, 192, 0), (255, 192, 0))
yellowButton = button(407, 122, 40, 40, (255, 255, 0), (255, 255, 0))
purpleButton = button(453, 122, 40, 40, (112, 48, 160), (112, 48, 160))
blackButton = button(407, 168, 40, 40, (0, 0, 0), (0, 0, 0))
whiteButton = button(453, 168, 40, 40, (0, 0, 0), (255, 255, 255), 1)
 
# Defining other buttons
clrButton = button(407, 214, 86, 40, (201, 201, 201), (0, 0, 0), 0, 1, 'Clear')
 
smallerButton = button(407, 260, 40, 40, (201, 201, 201), (0, 0, 0), 0, 2, '-')
biggerButton = button(453, 260, 40, 40, (201, 201, 201), (0, 0, 0), 0, 3, '+')
sizeDisplay = button(407, 306, 86, 40, (0, 0, 0), (0, 0, 0), 1, 4, 'Size')
playButton = button(407, 352, 86, 40, (201, 201, 201), (0, 0, 0), 0, 5, 'Play')
stopButton = button(407, 398, 86, 40, (201, 201, 201), (0, 0, 0), 0, 6, 'Stop')
timeDisplay = button(407, 444, 86, 40, (0, 0, 0), (0, 0, 0), 1, 7, 'Time')
 
Buttons_color = [blueButton, redButton, greenButton, orangeButton,
                 yellowButton, purpleButton, blackButton, whiteButton]
Buttons_other = [clrButton, smallerButton, biggerButton,
                 sizeDisplay, playButton, stopButton, timeDisplay]
 
main_loop()
 
list = pygame.font.get_fonts()
print(list)

Producción:

 

Publicación traducida automáticamente

Artículo escrito por ayushcoding100 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *