Kodiranje vlastite aplikacije za crtanje klasična je vježba koja će vas naučiti mnogo o GUI programiranju.

Jednostavan alat za slikanje jedna je od najčešćih aplikacija koje možete pronaći na većini računala. Omogućuje umjetniku da griješi bez straha, da odabere bilo koju boju pritiskom na gumb i trenutno promijeni veličinu svojih poteza kistom. Možete ga koristiti za izradu logotipa marke, konceptualizaciju korisničkih sučelja i označavanje dijagrama.

Dakle, kako možete napraviti aplikaciju boje?

Tkinter i Pillow modul

Za izradu aplikacije boje trebat će vam moduli Tkinter i Pillow. Tkinter je jedan od top Python okviri koje možete koristiti za prilagodbu vašeg GUI-ja. To je standardni Python GUI modul za izradu desktop aplikacija. Tkinter dolazi s raznim widgetima kao što su oznaka, unos, platno i gumb.

Pillow, fork Python Imaging Library (PIL), je modul za obradu slika za Python. Pomoću Pillowa možete otvarati, mijenjati veličinu, okretati i izrezivati ​​slike. Možeš pretvoriti formate datoteka, izradite aplikaciju za traženje recepata i dohvaćanje nasumičnih slika.

Da biste instalirali ove module, pokrenite:

pip install tk pillow

Definirajte strukturu nanošenja boje

Cijeli izvorni kod za ovaj projekt možete pronaći ovdje GitHub spremište.

Započnite s uvozom potrebnih modula. Definirajte klasu, DrawApp. Postavite naslov, boju pokazivača i boju gumice. Neka se aplikacija otvori na cijelom zaslonu. Nazovite setup_widgets metoda.

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

Definirajte metodu tzv setup_widgets. Definirajte oznaku koja prikazuje naslov. Postavite nadređeni element, tekst koji želite prikazati, stil fonta, boju pozadine i boju teksta. Definirajte okvir za paletu boja. Postavite nadređeni element, tekst koji bi trebao prikazati, stilove fonta i širinu obruba. Postavite obrub da izgleda poput grebena i da boja pozadine bude bijela.

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)

Definirajte skup boja za paletu boja na popisu. Iterirajte preko toga i stvorite gumb za svaki od njih. Postavite nadređeni element, boju pozadine, širinu obruba i izgled. Također postavite širinu i naredbu koju svaki gumb treba pokrenuti kada se klikne. Organizirajte sve elemente s odgovarajućom podlogom i bojama u dva skupa.

 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

Slično, definirajte gumb za brisanje, jedan za brisanje zaslona i jedan za spremanje slike.

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

Definirajte widget mjerila za povećanje ili smanjenje veličine pokazivača ili gumice. Postavite nadređeni element, orijentaciju, raspon i duljinu u pikselima. Definirajte platno i postavite nadređeni element, boju pozadine i širinu obruba. Također, postavite reljef tako da ima izgled utora zajedno s njegovom visinom i širinom.

Postavite platno s odgovarajućim koordinatama i postavite sidro na sjeverozapad (gore lijevo). Svežite B1-Kretanje na funkciju bojanja. B1 odnosi se na pritisnutu lijevu tipku miša i Pokret odnosi se na pokret. Općenito, koristite ga za praćenje kretanja miša dok pritiskate lijevu tipku.

 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)

Definirajte značajke aplikacije boje

Definirajte metodu, boja. Za slikanje, aplikacija će kontinuirano crtati sitne ovale. Oduzmite 2 od x i g koordinate događaja miša za određivanje gornjeg lijevog kuta ovala. Dodajte 2 kako biste odredili donji desni kut ovala. Napravite oval koristeći ove granične koordinate.

Postavite boju ispune, boju obrisa i širinu prema odabiru pokazivača.

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

Definirajte tri funkcije, odaberite boju, gumica za brisanje, i, čisti_zaslon. The odaberite boju metoda uzima boju i prema njoj postavlja pokazivač. The gumica za brisanje metoda postavlja pokazivač tako da ima učinak poput gumice i čini da crta prozirne linije. The čisti_zaslon metoda briše sve stavke na platnu.

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

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

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

Definirajte metodu, boja_platna. Otvorite birač boja sa svim različitim bojama. Vrati torku koja sadrži boju RGB format i heksadecimalni format. Ako korisnik odabere boju, upotrijebi konfigurirati način postavljanja boje pozadine. Postavite boju gumice na istu kao i boju pozadine.

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

Definirajte metodu, Spremi kao. Otvorite dijaloški okvir datoteke tražeći od korisnika da odabere naziv datoteke i putanju. Ako korisnik odabere put, upotrijebi Pillow's ImageGrab klasa za snimanje cijelog zaslona. Izrežite sliku pomoću navedenih koordinata kako biste dobili područje platna. Eksperimentirajte s koordinatama kako biste uhvatili željeni dio.

Spremite ovaj rezultat na željenu stazu datoteke. Prikaži okvir s porukom koji obavještava korisnika da je program uspješno spremio boju kao sliku. U slučaju bilo kakve pogreške, prikazuje odgovarajuću pogrešku.

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

Stvorite instancu Tk i DrawApp razreda. The glavna petlja() funkcija govori Pythonu da pokrene Tkinter petlju događaja i osluškuje događaje dok ne zatvorite prozor.

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

Testiranje različitih značajki slikanja pomoću Pythona

Kada pokrenete program za slikanje, vidjet ćete aplikaciju s paletom boja, četiri gumba, jednim klizačem i platnom za slikanje:

Pritisnite bilo koju boju da biste je odabrali. Zatim možete crtati na platnu u toj boji lijevom tipkom miša:

Pritiskom na Gumica za brisanje i povlačenjem klizača okomito prema gore, odabrat ćete gumicu i povećati njezinu veličinu. Testirajte gumicu tako da je povučete preko crteža kako biste izbrisali poteze.

Kada kliknete na Očisti zaslon gumb, program briše vaš prethodni crtež. Kliknite na Pozadina gumb za otvaranje palete boja i korištenje za promjenu boje pozadine.

Pritiskom na Spremi crtež otvara se dijaloški okvir datoteke. Odaberite put i naziv datoteke i program će je spremiti.

Poboljšanje primjene boje

Možete poboljšati funkcionalnost aplikacije boje dodavanjem opcije za dodavanje oblika. Možete dati opciju odabira vrste kista i neprozirnosti. Dodajte opciju za dodavanje teksta i naljepnica. Dodajte opciju za poništavanje, ponavljanje, promjenu veličine i okretanje slika. To će učiniti proces crtanja mnogo lakšim.

Za stvaranje oblika možete koristiti metode kao što su create_rectangle, create_oval, create_line i create_polygon. Za dodavanje teksta i slika koristite metode create_text i create_image. Za promjenu veličine i okretanje slika, možete koristiti Pillowove metode za promjenu veličine i transponiranje.