Koding av din egen malingsapp er en klassisk øvelse som vil lære deg mye om GUI-programmering.

Et enkelt malingsverktøy er en av de vanligste appene du kan finne på de fleste datamaskiner. Den lar kunstneren gjøre feil uten frykt, velge hvilken som helst farge ved å trykke på en knapp og endre størrelsen på penselstrøkene umiddelbart. Du kan bruke den til å lage merkelogoer, konseptualisere brukergrensesnitt og kommentere diagrammer.

Så hvordan kan du bygge en malingsapplikasjon?

Tkinter- og putemodulen

For å bygge en malingsapplikasjon trenger du modulene Tkinter og Pute. Tkinter er en av de topp Python-rammeverk du kan bruke til å tilpasse GUI. Det er standard Python GUI-modul for å lage skrivebordsapplikasjoner. Tkinter kommer med en rekke widgets som etikett, oppføring, lerret og knapp.

Pillow, en gaffel fra Python Imaging Library (PIL), er en bildebehandlingsmodul for Python. Med Pillow kan du åpne, endre størrelse, snu og beskjære bilder. Du kan konvertere filformater, bygg et oppskriftsøkerprogram, og hente tilfeldige bilder.

instagram viewer

For å installere disse modulene, kjør:

pip install tk pillow

Definer strukturen til malingsapplikasjonen

Du finner hele kildekoden for dette prosjektet i denne GitHub-depot.

Begynn med å importere de nødvendige modulene. Definer en klasse, DrawApp. Angi tittelen, pekerfargen og viskelærfargen. Gjør applikasjonen åpen i fullskjerm. Ring setup_widgets metode.

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()

Definer en metode kalt setup_widgets. Definer en etikett som viser en overskrift. Angi det overordnede elementet, teksten du vil vise, skriftstilen, bakgrunnsfargen og tekstfargen. Definer en ramme for fargepaletten. Angi det overordnede elementet, teksten det skal vise, skriftstilene og kantbredden. Angi kantlinjen slik at den får et åslignende utseende og bakgrunnsfargen som hvit.

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)

Definer et sett med farger for fargepaletten i en liste. Iterer over den og lag en knapp for hver av dem. Angi det overordnede elementet, bakgrunnsfargen, kantbredden og utseendet. Still også inn bredden og kommandoen hver knapp skal kjøre når den klikkes. Organiser alle elementene med passende polstring og fargene i sett med to.

 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

På samme måte definerer du en knapp for viskelæret, en for å tømme skjermen og en for å lagre bildet.

 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,
)

Definer en skaleringsmodul for å øke eller redusere størrelsen på pekeren eller viskelæret. Angi det overordnede elementet, retningen, rekkevidden og lengden i piksler. Definer et lerret og angi det overordnede elementet, bakgrunnsfargen og kantbredden. Sett også relieffet til å ha et sporutseende sammen med høyde og bredde.

Plasser lerretet med passende koordinater og sett ankeret mot nordvest (øverst til venstre). Bind den B1-Motion til malingsfunksjonen. B1 refererer til venstre museknapp holdt nede og Bevegelse refererer til bevegelsen. Totalt sett bruker du den til å spore musebevegelser mens du trykker på venstre knapp.

 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)

Definer funksjonene til malingsapplikasjonen

Definer en metode, maling. For å male vil appen kontinuerlig tegne minuttovaler. Trekk 2 fra x og y koordinater for musehendelsen for å bestemme øverste venstre hjørne av ovalen. Legg til 2 for å bestemme nederste høyre hjørne av ovalen. Lag en oval ved hjelp av disse avgrensende koordinatene.

Angi fyllfarge, konturfarge og bredde i henhold til pekerens valg.

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(),
)

Definer tre funksjoner, select_color, viskelær, og, klarskjerm. De select_color metoden tar en farge og setter pekeren deretter. De viskelær metoden setter pekeren til å ha en viskelærlignende effekt og får den til å tegne gjennomsiktige linjer. De klarskjerm metoden sletter alle elementene på lerretet.

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

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

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

Definer en metode, canvas_color. Åpne en fargevelger med alle de forskjellige fargene. Returner en tuppel som inneholder fargen RGB format og heksadesimalt format. Hvis brukeren velger en farge, bruk konfigurere metode for å angi bakgrunnsfargen. Sett fargen på viskelæret til den samme som bakgrunnsfargen.

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

Definer en metode, lagre som. Åpne en fildialogboks som ber brukeren velge filnavn og bane. Hvis brukeren velger en bane, bruk Pillow's ImageGrab klasse for å fange hele skjermen. Beskjær bildet ved å bruke de angitte koordinatene for å få lerretsområdet. Eksperimenter med koordinatene for å få tak i ønsket del.

Lagre dette resultatet til ønsket filbane. Vis en meldingsboks som informerer brukeren om at programmet har lagret malingen som et bilde. I tilfelle feil, viser den den tilsvarende feilen.

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}")

Opprett en forekomst av Tk og DrawApp klasse. De mainloop() funksjonen forteller Python å kjøre Tkinter-hendelsesløkken og lytte etter hendelser til du lukker vinduet.

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

Tester forskjellige malefunksjoner ved hjelp av Python

Når du kjører malingsprogrammet, vil du se en app med en fargepalett, fire knapper, en glidebryter og et lerret å male på:

Klikk en hvilken som helst farge for å velge den. Du kan deretter tegne på lerretet i den fargen med venstre museknapp:

Ved å klikke på Viskelær -knappen og dra glidebryteren vertikalt opp, velger du viskelæret og øker størrelsen. Test viskelæret ved å dra det over tegningen for å slette strekene.

Når du klikker på Tøm skjerm knappen, sletter programmet den forrige tegningen. Klikk på Bakgrunn -knappen for å åpne en fargepalett og bruke den til å endre bakgrunnsfargen.

Ved å klikke på Lagre tegning knappen, åpnes en fildialogboks. Velg en bane og navn for filen, og programmet vil lagre den.

Forbedring av malingsapplikasjonen

Du kan forbedre funksjonaliteten til malingsapplikasjonen ved å legge til et alternativ for å legge til former. Du kan gi et alternativ for å velge børstetype og opasitet. Legg til et alternativ for å legge til tekst og klistremerker. Legg til et alternativ for å angre, gjøre om, endre størrelse og snu bilder. Dette vil gjøre tegneprosessen mye jevnere.

For å lage former kan du bruke metoder som create_rectangle, create_oval, create_line og create_polygon. For å legge til tekst og bilder, bruk create_text and create_image-metoden. For å endre størrelse og snu bilder, kan du bruke Pillows endre størrelse og transponere metoder.