Codificar tu propia aplicación Paint es un ejercicio clásico que te enseñará mucho sobre programación GUI.

Una herramienta de pintura sencilla es una de las aplicaciones más comunes que puedes encontrar en la mayoría de las computadoras. Permite al artista cometer errores sin miedo, elegir cualquier color con solo hacer clic en un botón y cambiar el tamaño de sus pinceladas al instante. Puede usarlo para crear logotipos de marcas, conceptualizar interfaces de usuario y anotar diagramas.

Entonces, ¿cómo se puede crear una aplicación de pintura?

El módulo Tkinter y Pillow

Para crear una aplicación de pintura, necesitará los módulos Tkinter y Pillow. Tkinter es uno de los Los mejores frameworks de Python que puedes usar para personalizar tu GUI. Es el módulo GUI estándar de Python para crear aplicaciones de escritorio. Tkinter viene con una variedad de widgets como etiqueta, entrada, lienzo y botón.

Pillow, una bifurcación de Python Imaging Library (PIL), es un módulo de procesamiento de imágenes para Python. Con Pillow, puedes abrir, cambiar el tamaño, voltear y recortar imágenes. Puede

instagram viewer
convertir formatos de archivo, crear una aplicación de búsqueda de recetas y buscar imágenes aleatorias.

Para instalar estos módulos, ejecute:

pip install tk pillow

Definir la estructura de la aplicación de pintura.

Puede encontrar el código fuente completo de este proyecto en este repositorio de GitHub.

Comience importando los módulos necesarios. Definir una clase, dibujaraplicación. Establezca el título, el color del puntero y el color del borrador. Haga que la aplicación se abra en pantalla completa. Llama a configuración_widgets método.

import tkinter as tk
from tkinter.ttk import Scale
from tkinter import colorchooser, filedialog, messagebox
import PIL.ImageGrab as ImageGrab

classDrawApp:
def__init__(self, root):
self.root = root
self.root.title("Kids' Paint App")
self.root.attributes("-fullscreen", True)
self.pointer = "black"
self.erase = "white"
self.setup_widgets()

Definir un método llamado configuración_widgets. Defina una etiqueta que muestre un encabezado. Configure el elemento principal, el texto que desea mostrar, el estilo de fuente, el color de fondo y el color del texto. Defina un marco para la paleta de colores. Establezca el elemento principal, el texto que debe mostrar, los estilos de fuente y el ancho del borde. Configure el borde para que tenga una apariencia de cresta y el color de fondo sea blanco.

defsetup_widgets(self):
self.title_label = tk.Label(
self.root,
text="Kids' Paint App",
font=("Comic Sans MS", 30),
bg="lightblue",
fg="purple",
)
self.title_label.pack(fill=tk.X, pady=10)
self.color_frame = tk.LabelFrame(
self.root,
text="Colors",
font=("Comic Sans MS", 15),
bd=5,
relief=tk.RIDGE,
bg="white",
)
self.color_frame.place(x=10, y=80, width=90, height=180)

Defina un conjunto de colores para la paleta de colores en una lista. Repita sobre él y cree un botón para cada uno de ellos. Establezca el elemento principal, el color de fondo, el ancho del borde y la apariencia. También establezca el ancho y el comando que cada botón debe ejecutar cuando se hace clic. Organiza todos los elementos con el relleno adecuado y los colores en juegos de dos.

 colors = [
"blue",
"red",
"green",
"orange",
"violet",
"black",
"yellow",
"purple",
"pink",
"gold",
"brown",
"indigo",
]
i, j = 0, 0
for color in colors:
tk.Button(
self.color_frame,
bg=color,
bd=2,
relief=tk.RIDGE,
width=3,
command=lambda col=color: self.select_color(col),
).grid(row=i, column=j, padx=2, pady=2)
i += 1
if i == 4:
i = 0
j = 1

De manera similar, defina un botón para el borrador, uno para borrar la pantalla y otro para guardar la imagen.

 self.eraser_btn = tk.Button(
self.root,
text="Eraser",
bd=4,
bg="white",
command=self.eraser,
width=9,
relief=tk.RIDGE,
font=("Comic Sans MS", 12),
)
self.eraser_btn.place(x=10, y=310)
self.clear_screen_btn = tk.Button(
self.root,
text="Clear Screen",
bd=4,
bg="white",
command=self.clear_screen,
width=12,
relief=tk.RIDGE,
font=("Comic Sans MS", 12),
)
self.clear_screen_btn.place(x=10, y=370)
self.save_as_btn = tk.Button(
self.root,
text="Save Drawing",
bd=4,
bg="white",
command=self.save_as,
width=12,
relief=tk.RIDGE,
font=("Comic Sans MS", 12),
)
self.save_as_btn.place(x=10, y=430)
self.bg_btn = tk.Button(
self.root,
text="Background",
bd=4,
bg="white",
command=self.canvas_color,
width=12,
relief=tk.RIDGE,
font=("Comic Sans MS", 12),
)
self.bg_btn.place(x=10, y=490)
self.pointer_frame = tk.LabelFrame(
self.root,
text="Size",
bd=5,
bg="white",
font=("Comic Sans MS", 15, "bold"),
relief=tk.RIDGE,
)

Defina un widget de escala para aumentar o disminuir el tamaño del puntero o borrador. Establezca el elemento principal, la orientación, el rango y la longitud en píxeles. Defina un lienzo y establezca el elemento principal, el color de fondo y el ancho del borde. Además, configure el relieve para que tenga una apariencia de ranura junto con su altura y ancho.

Coloque el lienzo con las coordenadas adecuadas y establezca el ancla en el noroeste (arriba a la izquierda). Atar el B1-Movimiento a la función de pintura. B1 se refiere al botón izquierdo del mouse mantenido presionado y Movimiento se refiere al movimiento. En general, lo usa para rastrear el movimiento del mouse mientras presiona el botón izquierdo.

 self.pointer_frame.place(x=10, y=580, height=150, width=70)
self.pointer_size = Scale(
self.pointer_frame, orient=tk.VERTICAL, from_=48, to=1, length=120
)
self.pointer_size.set(1)
self.pointer_size.grid(row=0, column=1, padx=15)
self.canvas = tk.Canvas(
self.root, bg="white", bd=5, relief=tk.GROOVE, height=650, width=1300
)
self.canvas.place(x=160, y=120, anchor="nw")
self.canvas.bind("", self.paint)

Definir las características de la aplicación Paint

Definir un método, pintar. Para pintar, la aplicación dibujará continuamente óvalos diminutos. Resta 2 de la X y y coordenadas del evento del mouse para determinar la esquina superior izquierda del óvalo. Suma 2 para determinar la esquina inferior derecha del óvalo. Crea un óvalo usando estas coordenadas delimitadoras.

Establezca el color de relleno, el color del contorno y el ancho según la selección del puntero.

defpaint(self, event):
x1, y1 = (event.x - 2), (event.y - 2)
x2, y2 = (event.x + 2), (event.y + 2)
self.canvas.create_oval(
x1,
y1,
x2,
y2,
fill=self.pointer,
outline=self.pointer,
width=self.pointer_size.get(),
)

Definir tres funciones, seleccionar el color, borrador, y, pantalla clara. El seleccionar el color El método toma un color y establece el puntero en consecuencia. El borrador El método configura el puntero para que tenga un efecto similar a un borrador y lo hace dibujar líneas transparentes. El pantalla clara El método elimina todos los elementos del lienzo.

defselect_color(self, col):
self.pointer = col

deferaser(self):
self.pointer = self.erase

defclear_screen(self):
self.canvas.delete("all")

Definir un método, color del lienzo. Abra un selector de color con todos los colores diferentes. Devuelve una tupla que contiene el color en RGB formato y formato hexadecimal. Si el usuario elige un color, utilice el configurar Método para establecer el color de fondo. Establezca el color del borrador al mismo color que el color de fondo.

defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]

Definir un método, guardar como. Abra un cuadro de diálogo de archivo pidiendo al usuario que elija el nombre del archivo y la ruta. Si el usuario selecciona una ruta, use Pillow's Grabación de imágenes clase para capturar toda la pantalla. Recorta la imagen usando las coordenadas especificadas para obtener la región del lienzo. Experimente con las coordenadas para agarrar la parte deseada.

Guarde este resultado en la ruta del archivo deseada. Muestra un cuadro de mensaje que informa al usuario que el programa ha guardado correctamente la pintura como imagen. En caso de algún error muestra el error correspondiente.

defsave_as(self):
file_path = filedialog.asksaveasfilename(
defaultextension=".jpg", filetypes=[("Image files", "*.jpg")]
)
if file_path:
try:
y = 148
x = 200
y1 = 978
x1 = 1840
ImageGrab.grab().crop((x, y, x1, y1)).save(file_path)
messagebox.showinfo("Save Drawing", "Image file saved successfully!")
except Exception as e:
messagebox.showerror("Error", f"Failed to save the image file: {e}")

Crear una instancia del tk y el dibujaraplicación clase. El bucle principal() La función le dice a Python que ejecute el bucle de eventos de Tkinter y escuche los eventos hasta que cierre la ventana.

if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()

Probar diferentes características de pintura usando Python

Cuando ejecutas el programa de pintura, verás una aplicación con una paleta de colores, cuatro botones, un control deslizante y un lienzo para pintar:

Haga clic en cualquier color para seleccionarlo. Luego podrás dibujar en el lienzo en ese color con el botón izquierdo del ratón:

Al hacer clic en el Borrador y arrastrando el control deslizante verticalmente hacia arriba, seleccionará el borrador y aumentará su tamaño. Prueba el borrador arrastrándolo sobre tu dibujo para borrar los trazos.

Cuando haces clic en Pantalla clara, el programa borra el dibujo anterior. Haga clic en el Fondo para abrir una paleta de colores y utilizarla para cambiar el color de fondo.

Al hacer clic en el Guardar dibujo, se abre un cuadro de diálogo de archivo. Elija una ruta y un nombre para el archivo y el programa lo guardará.

Mejora de la aplicación de pintura

Puede mejorar la funcionalidad de la aplicación de pintura agregando una opción para agregar formas. Puede dar la opción de seleccionar el tipo de pincel y la opacidad. Agregue una opción para agregar texto y pegatinas. Agregue una opción para deshacer, rehacer, cambiar el tamaño y voltear imágenes. Esto hará que el proceso de dibujo sea mucho más fluido.

Para crear formas, puede utilizar métodos como create_rectangle, create_oval, create_line y create_polygon. Para agregar texto e imágenes, use el método create_text y create_image. Para cambiar el tamaño y voltear imágenes, puede utilizar los métodos de cambio de tamaño y transposición de Pillow.