Het coderen van je eigen Paint-app is een klassieke oefening die je veel leert over GUI-programmeren.
Een eenvoudig tekenhulpmiddel is een van de meest voorkomende apps die u op de meeste computers kunt vinden. Hiermee kan de kunstenaar zonder angst fouten maken, met één klik op de knop een willekeurige kleur kiezen en de grootte van zijn penseelstreken onmiddellijk wijzigen. U kunt het gebruiken om merklogo's te maken, gebruikersinterfaces te conceptualiseren en diagrammen te annoteren.
Dus, hoe kun je een verftoepassing bouwen?
De Tkinter- en kussenmodule
Om een verftoepassing te bouwen, heb je de Tkinter- en Pillow-modules nodig. Tkinter is een van de top Python-frameworks die u kunt gebruiken om uw GUI aan te passen. Het is de standaard Python GUI-module voor het maken van desktopapplicaties. Tkinter wordt geleverd met een verscheidenheid aan widgets, zoals label, invoer, canvas en knop.
Pillow, een vork van de Python Imaging Library (PIL), is een beeldverwerkingsmodule voor Python. Met Pillow kunt u afbeeldingen openen, vergroten of verkleinen, omdraaien en bijsnijden. Jij kan
bestandsformaten converteren, een receptzoeker-applicatie bouwen, en willekeurige afbeeldingen ophalen.Om deze modules te installeren, voert u het volgende uit:
pip install tk pillow
Definieer de structuur van de verftoepassing
Hier vindt u de volledige broncode voor dit project GitHub-opslagplaats.
Begin met het importeren van de vereiste modules. Definieer een klasse, Tekenapp. Stel de titel, de aanwijzerkleur en de gumkleur in. Open de applicatie op volledig scherm. Bel de setup_widgets methode.
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()
Definieer een methode genaamd setup_widgets. Definieer een label dat een kop weergeeft. Stel het bovenliggende element in, de tekst die u wilt weergeven, de lettertypestijl, de achtergrondkleur en de tekstkleur. Definieer een kader voor het kleurenpalet. Stel het bovenliggende element in, de tekst die het moet weergeven, de lettertypestijlen en de randbreedte. Stel de rand zo in dat deze er als een rand uitziet en de achtergrondkleur wit is.
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)
Definieer een reeks kleuren voor het kleurenpalet in een lijst. Herhaal dit en maak voor elk ervan een knop. Stel het bovenliggende element, de achtergrondkleur, de randbreedte en het uiterlijk in. Stel ook de breedte in en de opdracht die elke knop moet uitvoeren wanneer erop wordt geklikt. Organiseer alle elementen met de juiste opvulling en kleuren in sets van twee.
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
Definieer op dezelfde manier een knop voor de gum, één om het scherm leeg te maken en één om de afbeelding op te slaan.
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,
)
Definieer een schaalwidget om de grootte van de aanwijzer of gum te vergroten of verkleinen. Stel het bovenliggende element, de oriëntatie, het bereik en de lengte in pixels in. Definieer een canvas en stel het bovenliggende element, de achtergrondkleur en de randbreedte in. Stel het reliëf ook zo in dat het er groefachtig uitziet, samen met de hoogte en breedte.
Plaats het canvas met de juiste coördinaten en plaats het anker op het noordwesten (linksboven). Bind de B1-beweging naar de verffunctie. B1 verwijst naar de linkermuisknop ingedrukt en Beweging verwijst naar de beweging. Over het algemeen gebruik je het om de muisbewegingen te volgen terwijl je op de linkerknop drukt.
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)
Definieer de kenmerken van de verftoepassing
Definieer een methode, verf. Om te schilderen tekent de app voortdurend kleine ovalen. Trek 2 af van de X En j coördinaten van de muisgebeurtenis om de linkerbovenhoek van het ovaal te bepalen. Voeg 2 toe om de rechteronderhoek van het ovaal te bepalen. Maak een ovaal met behulp van deze grenscoördinaten.
Stel de vulkleur, omtrekkleur en breedte in volgens de selectie van de aanwijzer.
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(),
)
Definieer drie functies, selecteer kleur, gom, En, leeg scherm. De selecteer kleur methode neemt een kleur en stelt de aanwijzer dienovereenkomstig in. De gom -methode zorgt ervoor dat de aanwijzer een gumachtig effect heeft en zorgt ervoor dat deze transparante lijnen tekent. De leeg scherm methode verwijdert alle items op het canvas.
defselect_color(self, col):
self.pointer = coldeferaser(self):
self.pointer = self.erase
defclear_screen(self):
self.canvas.delete("all")
Definieer een methode, Canvas kleur. Open een kleurkiezer met alle verschillende kleuren. Retourneer een tupel met de kleur erin RGB formaat en hexadecimaal formaat. Als de gebruiker een kleur kiest, gebruik dan de configureren methode om de achtergrondkleur in te stellen. Stel de kleur van de gum in op dezelfde kleur als de achtergrondkleur.
defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]
Definieer een methode, opslaan als. Open een bestandsdialoogvenster waarin de gebruiker wordt gevraagd de bestandsnaam en het pad te kiezen. Als de gebruiker een pad selecteert, gebruik dan Pillow's BeeldGrab klasse om het hele scherm vast te leggen. Snijd de afbeelding bij met behulp van de opgegeven coördinaten om het canvasgebied te verkrijgen. Experimenteer met de coördinaten om het gewenste onderdeel te pakken.
Sla dit resultaat op in het gewenste bestandspad. Geef een berichtvenster weer waarin de gebruiker wordt geïnformeerd dat het programma de verf met succes als afbeelding heeft opgeslagen. In geval van een fout wordt de bijbehorende fout weergegeven.
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}")
Maak een exemplaar van de Tk en de Tekenapp klas. De Hoofdlus() functie vertelt Python om de Tkinter-gebeurtenislus uit te voeren en naar gebeurtenissen te luisteren totdat je het venster sluit.
if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()
Verschillende schilderfuncties testen met Python
Wanneer u het verfprogramma uitvoert, ziet u een app met een kleurenpalet, vier knoppen, één schuifregelaar en een canvas om op te schilderen:
Klik op een kleur om deze te selecteren. Vervolgens kunt u met de linkermuisknop in die kleur op het canvas tekenen:
Door te klikken op de Gom en sleept u de schuifregelaar verticaal omhoog, selecteert u de gum en vergroot u de grootte ervan. Test de gum door deze over uw tekening te slepen om de streken te wissen.
Wanneer u op de Leeg scherm knop, het programma wist uw vorige tekening. Klik op de Achtergrond om een kleurenpalet te openen en deze te gebruiken om de achtergrondkleur te wijzigen.
Door te klikken op de Tekening opslaan klikt, wordt er een bestandsdialoogvenster geopend. Kies een pad en naam voor het bestand, en het programma slaat het op.
Verbetering van de verftoepassing
U kunt de functionaliteit van de verftoepassing verbeteren door een optie toe te voegen om vormen toe te voegen. U kunt een optie opgeven om het penseeltype en de dekking te selecteren. Voeg een optie toe om tekst en stickers toe te voegen. Voeg een optie toe voor het ongedaan maken, opnieuw uitvoeren, vergroten of verkleinen en omdraaien van afbeeldingen. Dit maakt het tekenproces veel soepeler.
Om vormen te maken, kunt u methoden gebruiken zoals create_rectangle, create_oval, create_line en create_polygon. Gebruik de methode create_text en create_image om tekst en afbeeldingen toe te voegen. Om afbeeldingen te vergroten of verkleinen en om te draaien, kunt u de methoden voor het wijzigen en transponeren van Pillow gebruiken.