Codarea propriei aplicații de vopsea este un exercițiu clasic care vă va învăța multe despre programarea GUI.
Un instrument simplu de vopsire este una dintre cele mai comune aplicații pe care le puteți găsi pe majoritatea computerelor. Îi permite artistului să facă greșeli fără teamă, să aleagă orice culoare cu un clic pe un buton și să schimbe instantaneu dimensiunea loviturilor de pensulă. Îl puteți folosi pentru a crea logo-uri de marcă, a conceptualiza interfețele utilizatorului și a adnota diagrame.
Deci, cum puteți construi o aplicație de vopsea?
Modulul Tkinter și Pillow
Pentru a crea o aplicație de vopsea, veți avea nevoie de modulele Tkinter și Pillow. Tkinter este unul dintre cadrele Python de top pe care le puteți folosi pentru a vă personaliza GUI. Este modulul standard Python GUI pentru crearea de aplicații desktop. Tkinter vine cu o varietate de widget-uri precum etichetă, intrare, pânză și buton.
Pillow, o furcă a Bibliotecii de imagini Python (PIL), este un modul de procesare a imaginilor pentru Python. Cu Pillow, puteți deschide, redimensiona, răsturna și decupa imaginile. Puteți
converti formate de fișiere, construiți o aplicație de căutare de rețete și prelua imagini aleatorii.Pentru a instala aceste module, rulați:
pip install tk pillow
Definiți structura aplicației de vopsea
Puteți găsi întregul cod sursă pentru acest proiect în acest articol Depozitul GitHub.
Începeți prin a importa modulele necesare. Definiți o clasă, DrawApp. Setați titlul, culoarea indicatorului și culoarea radierei. Faceți ca aplicația să se deschidă pe ecran complet. Suna setup_widgets metodă.
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()
Definiți o metodă numită setup_widgets. Definiți o etichetă care să afișeze un titlu. Setați elementul părinte, textul pe care doriți să-l afișați, stilul fontului, culoarea de fundal și culoarea textului. Definiți un cadru pentru paleta de culori. Setați elementul părinte, textul pe care ar trebui să-l afișeze, stilurile de font și lățimea chenarului. Setați chenarul să aibă un aspect ca o creastă și culoarea de fundal ca albă.
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)
Definiți un set de culori pentru paleta de culori într-o listă. Repetați peste el și creați un buton pentru fiecare dintre ele. Setați elementul părinte, culoarea de fundal, lățimea chenarului și aspectul. Setați, de asemenea, lățimea și comanda pe care fiecare buton ar trebui să ruleze atunci când este apăsat. Organizați toate elementele cu căptușeală adecvată și culorile în seturi de câte două.
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
În mod similar, definiți un buton pentru radieră, unul pentru a șterge ecranul și unul pentru a salva imaginea.
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,
)
Definiți un widget de scară pentru a mări sau a micșora dimensiunea indicatorului sau radierului. Setați elementul părinte, orientarea, intervalul și lungimea în pixeli. Definiți o pânză și setați elementul părinte, culoarea de fundal și lățimea chenarului. De asemenea, setați relieful să aibă un aspect de canelură împreună cu înălțimea și lățimea.
Poziționați pânza cu coordonatele adecvate și setați ancora în nord-vest (stânga sus). Leagă B1-Mișcare la funcția de vopsea. B1 se referă la butonul stâng al mouse-ului ținut apăsat și Mişcare se referă la mișcare. În general, îl folosiți pentru a urmări mișcarea mouse-ului în timp ce apăsați butonul din stânga.
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)
Definiți caracteristicile aplicației de vopsea
Definiți o metodă, a picta. Pentru a picta, aplicația va desena continuu ovale minute. Scădeți 2 din X și y coordonatele evenimentului mouse-ului pentru a determina colțul din stânga sus al ovalului. Adăugați 2 pentru a determina colțul din dreapta jos al ovalului. Creați un oval folosind aceste coordonate de delimitare.
Setați culoarea de umplere, culoarea conturului și lățimea conform selecției indicatorului.
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(),
)
Definiți trei funcții, select_color, radieră, și, ecran_clear. The select_color metoda ia o culoare și setează indicatorul în consecință. The radieră metoda setează indicatorul să aibă un efect asemănător șters și îl face să deseneze linii transparente. The ecran_clear metoda șterge toate elementele de pe pânză.
defselect_color(self, col):
self.pointer = coldeferaser(self):
self.pointer = self.erase
defclear_screen(self):
self.canvas.delete("all")
Definiți o metodă, culoarea_pânză. Deschideți un selector de culori cu toate culorile diferite. Returnează un tuplu care conține culoarea în RGB format și format hexazecimal. Dacă utilizatorul alege o culoare, utilizați configurați metoda de a seta culoarea de fundal. Setați culoarea radierei la aceeași cu culoarea de fundal.
defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]
Definiți o metodă, Salvează ca. Deschideți o casetă de dialog pentru fișier, solicitând utilizatorului să aleagă numele și calea fișierului. Dacă utilizatorul selectează o cale, folosește Pillow's ImageGrab clasă pentru a captura întregul ecran. Decupați imaginea folosind coordonatele specificate pentru a obține regiunea pânzei. Experimentați cu coordonatele pentru a prinde piesa dorită.
Salvați acest rezultat pe calea fișierului dorită. Afișează o casetă de mesaj care informează utilizatorul că programul a salvat cu succes vopseaua ca imagine. În cazul oricărei erori, afișează eroarea corespunzătoare.
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}")
Creați o instanță a Tk si DrawApp clasă. The mainloop() funcția îi spune lui Python să ruleze bucla de evenimente Tkinter și să asculte evenimente până când închideți fereastra.
if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()
Testarea diferitelor caracteristici de pictură folosind Python
Când rulați programul de vopsire, veți vedea o aplicație cu o paletă de culori, patru butoane, un glisor și o pânză pe care să pictați:
Faceți clic pe orice culoare pentru a o selecta. Apoi puteți desena pe pânză în acea culoare cu butonul stâng al mouse-ului:
Făcând clic pe Radieră și trăgând glisorul vertical în sus, veți selecta radiera și veți mări dimensiunea acesteia. Testați radiera trăgând-o peste desen pentru a șterge liniile.
Când faceți clic pe Șterge ecranul butonul, programul șterge desenul anterior. Apasă pe fundal butonul pentru a deschide o paletă de culori și utilizați-o pentru a schimba culoarea de fundal.
Făcând clic pe Salvați desenul butonul, se deschide o casetă de dialog pentru fișier. Alegeți o cale și un nume pentru fișier, iar programul îl va salva.
Îmbunătățirea aplicației de vopsea
Puteți îmbunătăți funcționalitatea aplicației de vopsea adăugând o opțiune pentru a adăuga forme. Puteți oferi o opțiune pentru a selecta tipul de pensulă și opacitatea. Adăugați o opțiune pentru a adăuga text și autocolante. Adăugați o opțiune pentru anularea, refacerea, redimensionarea și întoarcerea imaginilor. Acest lucru va face procesul de desen mult mai ușor.
Pentru a crea forme, puteți folosi metode precum create_rectangle, create_oval, create_line și create_polygon. Pentru a adăuga text și imagini, utilizați metoda create_text și create_image. Pentru a redimensiona și a răsturna imaginile, puteți utiliza metodele de redimensionare și transpunere de la Pillow.