A saját festékalkalmazás kódolása egy klasszikus gyakorlat, amely sok mindent megtanít a GUI programozásról.
Az egyszerű festőeszköz az egyik leggyakoribb alkalmazás, amelyet a legtöbb számítógépen találhat. Lehetővé teszi, hogy a művész félelem nélkül hibázzon, egyetlen gombnyomással kiválaszthasson bármilyen színt, és azonnal módosítsa az ecsetvonások méretét. Használhatja márkalogók létrehozására, felhasználói felületek koncepciózására és diagramok megjegyzésére.
Szóval, hogyan készíthet festék alkalmazást?
A Tkinter és párna modul
Festék alkalmazás elkészítéséhez szüksége lesz a Tkinter és a Pillow modulokra. Tkinter az egyik legnépszerűbb Python-keretrendszerek, amelyek segítségével testreszabhatja grafikus felhasználói felületét. Ez a szabványos Python GUI modul asztali alkalmazások létrehozásához. A Tkinter számos widgettel érkezik, például címke, bejegyzés, vászon és gomb.
A Pillow, a Python Imaging Library (PIL) villája, a Python képfeldolgozó modulja. A Pillow segítségével megnyithatja, átméretezheti, megfordíthatja és körbevághatja a képeket. tudsz
fájlformátumok konvertálása, készítsen receptkereső alkalmazást, és véletlenszerű képeket hozzon le.A modulok telepítéséhez futtassa:
pip install tk pillow
Határozza meg a festék alkalmazás szerkezetét
Ebben a projektben megtalálja a teljes forráskódot GitHub adattár.
Kezdje a szükséges modulok importálásával. Határozzon meg egy osztályt, DrawApp. Állítsa be a címet, a mutató színét és a radír színét. Nyissa meg az alkalmazást teljes képernyőn. Hívja a setup_widgets módszer.
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()
Határozza meg az ún setup_widgets. Határozzon meg egy címkét, amely címsort jelenít meg. Állítsa be a szülőelemet, a megjeleníteni kívánt szöveget, a betűstílust, a háttérszínt és a szöveg színét. Határozzon meg egy keretet a színpalettához. Állítsa be a szülőelemet, a megjelenítendő szöveget, a betűstílusokat és a szegély szélességét. Állítsa be a szegélyt úgy, hogy bordázatszerű megjelenésű legyen, a háttérszínt pedig fehérre.
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)
Határozzon meg egy színkészletet a színpalettához egy listában. Iteráljon rajta, és hozzon létre egy-egy gombot mindegyikhez. Állítsa be a szülőelemet, a háttérszínt, a keret szélességét és a megjelenést. Állítsa be a szélességet és azt a parancsot is, hogy az egyes gombok kattintáskor futjanak. Rendezze az összes elemet megfelelő párnázással és a színekkel kettős készletekbe.
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
Hasonlóképpen határozzon meg egy gombot a radírhoz, egyet a képernyő törléséhez, egyet pedig a kép mentéséhez.
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,
)
Határozzon meg egy méretarányos widgetet a mutató vagy a radír méretének növeléséhez vagy csökkentéséhez. Állítsa be a szülőelemet, a tájolást, a tartományt és a hosszt képpontokban. Határozzon meg egy vásznat, és állítsa be a szülőelemet, a háttérszínt és a szegély szélességét. Ezenkívül állítsa be a domborművet úgy, hogy a magasságával és szélességével együtt barázdált legyen.
Helyezze el a vásznat a megfelelő koordinátákkal, és állítsa a horgonyt északnyugatra (bal felső sarokban). Kösd meg a B1-Motion a festék funkcióhoz. B1 a és a bal egérgomb lenyomva tartására utal Mozgás mozgásra utal. Összességében az egér mozgásának nyomon követésére használhatja, miközben megnyomja a bal gombot.
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)
Határozza meg a festék alkalmazás jellemzőit
Határozzon meg egy módszert, festék. A festéshez az alkalmazás folyamatosan apró oválisokat rajzol. Vonjunk le 2-t a x és y az egéresemény koordinátái az ovális bal felső sarkának meghatározásához. Adjon hozzá 2-t az ovális jobb alsó sarkának meghatározásához. Hozzon létre egy oválist ezekkel a határoló koordinátákkal.
Állítsa be a kitöltés színét, a körvonal színét és a szélességet a mutató kiválasztásának megfelelően.
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(),
)
Határozzon meg három függvényt, select_color, radír, és, clear_screen. A select_color metódus színt vesz fel, és ennek megfelelően állítja be a mutatót. A radír metódus a mutatót radírszerű hatásra állítja be, és átlátszó vonalakat rajzol belőle. A clear_screen módszer törli az összes elemet a vászonról.
defselect_color(self, col):
self.pointer = coldeferaser(self):
self.pointer = self.erase
defclear_screen(self):
self.canvas.delete("all")
Határozzon meg egy módszert, vászonszín. Nyisson meg egy színválasztót az összes különböző színnel. Adjon vissza egy sort, amely tartalmazza a színt RGB formátum és hexadecimális formátum. Ha a felhasználó színt választ, használja a Beállítás módszer a háttérszín beállítására. Állítsa be a radír színét a háttér színével megegyezőre.
defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]
Határozzon meg egy módszert, mentés másként. Nyisson meg egy fájl párbeszédpanelt, amelyben megkéri a felhasználót, hogy válassza ki a fájl nevét és elérési útját. Ha a felhasználó kiválaszt egy utat, használja a Pillow's-t ImageGrab osztályban a teljes képernyő rögzítéséhez. Vágja le a képet a megadott koordinátákkal a vászonrégió megszerzéséhez. Kísérletezzen a koordinátákkal, hogy megragadja a kívánt részt.
Mentse ezt az eredményt a kívánt fájl elérési útjára. Jelenítsen meg egy üzenetablakot, amely tájékoztatja a felhasználót, hogy a program sikeresen elmentette a festéket képként. Bármilyen hiba esetén megjeleníti a megfelelő hibát.
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}")
Hozzon létre egy példányt a Tk és a DrawApp osztály. A mainloop() függvény azt mondja a Pythonnak, hogy futtassa a Tkinter eseményhurkot, és figyelje az eseményeket, amíg be nem zárja az ablakot.
if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()
Különböző festési funkciók tesztelése Python használatával
A festőprogram futtatásakor megjelenik egy alkalmazás színpalettával, négy gombbal, egy csúszkával és egy vászonnal, amelyre festhet:
Kattintson bármelyik színre a kiválasztásához. Ezután a bal egérgombbal rajzolhat a vászonra az adott színben:
A gombra kattintva Radír gombot, és a csúszkát függőlegesen felfelé húzva kiválasztja a radírt, és megnöveli a méretét. Tesztelje a radírt úgy, hogy a rajz fölé húzza a körvonalak törléséhez.
Amikor rákattint a Tiszta képernyő gombot, a program törli az előző rajzot. Kattints a Háttér gombot a színpaletta megnyitásához és a háttérszín megváltoztatásához.
A gombra kattintva Rajz mentése gombot, megnyílik egy fájl párbeszédpanel. Válassza ki a fájl elérési útját és nevét, és a program elmenti azt.
A festék alkalmazás javítása
A festőalkalmazás funkcionalitását formák hozzáadásának lehetőségével bővítheti. Lehetőséget adhat az ecset típusának és átlátszatlanságának kiválasztására. Adjon hozzá egy lehetőséget szöveg és matricák hozzáadásához. Adjon hozzá egy lehetőséget a képek visszavonásához, újrakészítéséhez, átméretezéséhez és megfordításához. Ez sokkal gördülékenyebbé teszi a rajzolási folyamatot.
Alakzatok létrehozásához olyan módszereket használhat, mint a_recangle_recangle, Create_oval, Create_line és Create_polygon. Szöveg és képek hozzáadásához használja a create_text és create_image metódust. A képek átméretezéséhez és átfordításához használhatja a Pillow átméretezési és transzponálási módszereit.