Kódování vlastní aplikace pro malování je klasické cvičení, které vás naučí hodně o programování GUI.

Jednoduchý nástroj pro malování je jednou z nejběžnějších aplikací, které můžete najít na většině počítačů. Umožňuje umělci bez obav dělat chyby, vybrat si libovolnou barvu kliknutím na tlačítko a okamžitě změnit velikost tahů štětcem. Můžete jej použít k vytváření log značek, konceptualizaci uživatelských rozhraní a anotaci diagramů.

Jak tedy můžete vytvořit aplikaci barvy?

Modul Tkinter a polštář

K vytvoření aplikace barvy budete potřebovat moduly Tkinter a Pillow. Tkinter je jedním z top frameworky Pythonu, které můžete použít k přizpůsobení GUI. Je to standardní modul Python GUI pro vytváření desktopových aplikací. Tkinter přichází s řadou widgetů, jako je štítek, záznam, plátno a tlačítko.

Pillow, větev Python Imaging Library (PIL), je modul pro zpracování obrázků pro Python. S Polštářem můžete obrázky otevírat, měnit jejich velikost, převracet je a ořezávat. Můžeš převádět formáty souborů, vytvořit aplikaci pro vyhledávání receptů a načítat náhodné obrázky.

instagram viewer

Chcete-li nainstalovat tyto moduly, spusťte:

pip install tk pillow

Definujte strukturu aplikace Malování

Celý zdrojový kód tohoto projektu najdete zde úložiště GitHub.

Začněte importem požadovaných modulů. Definujte třídu, DrawApp. Nastavte nadpis, barvu ukazatele a barvu gumy. Otevřete aplikaci na celou obrazovku. Zavolej 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()

Definujte metodu nazvanou setup_widgets. Definujte štítek, který zobrazuje nadpis. Nastavte nadřazený prvek, text, který chcete zobrazit, styl písma, barvu pozadí a barvu textu. Definujte rámeček pro paletu barev. Nastavte nadřazený prvek, text, který má zobrazit, styly písma a šířku ohraničení. Nastavte okraj tak, aby měl vzhled hřebene a barvu pozadí jako bílou.

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)

Definujte sadu barev pro barevnou paletu v seznamu. Iterujte přes něj a vytvořte tlačítko pro každý z nich. Nastavte rodičovský prvek, barvu pozadí, šířku ohraničení a vzhled. Nastavte také šířku a příkaz, který se má každé tlačítko spustit po kliknutí. Uspořádejte všechny prvky pomocí vhodného polstrování a barev do sad po dvou.

 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

Podobně definujte tlačítko pro gumu, jedno pro vymazání obrazovky a druhé pro uložení obrázku.

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

Definujte widget měřítka pro zvětšení nebo zmenšení velikosti ukazatele nebo gumy. Nastavte rodičovský prvek, orientaci, rozsah a délku v pixelech. Definujte plátno a nastavte rodičovský prvek, barvu pozadí a šířku okraje. Také nastavte reliéf tak, aby měl vzhled drážky spolu s jeho výškou a šířkou.

Umístěte plátno s příslušnými souřadnicemi a nastavte kotvu na severozápad (vlevo nahoře). Svažte se B1-Pohyb na funkci lakování. B1 označuje stisknuté levé tlačítko myši a Pohyb odkazuje na pohyb. Celkově jej používáte ke sledování pohybu myši při stisknutí levého tlačítka.

 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)

Definujte vlastnosti aplikace Malování

Definujte metodu, malovat. Chcete-li malovat, aplikace bude nepřetržitě kreslit minutové ovály. Odečtěte 2 od X a y souřadnice události myši k určení levého horního rohu oválu. Přidejte 2, abyste určili pravý dolní roh oválu. Pomocí těchto ohraničujících souřadnic vytvořte ovál.

Nastavte barvu výplně, barvu obrysu a šířku podle výběru ukazatele.

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

Definujte tři funkce, vybrat_barvu, guma, a, clear_screen. The vybrat_barvu metoda vezme barvu a podle toho nastaví ukazatel. The guma metoda nastaví ukazatel tak, aby měl efekt podobný gumě, a umožní mu kreslit průhledné čáry. The clear_screen metoda odstraní všechny položky na plátně.

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

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

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

Definujte metodu, barva_kanvasu. Otevřete výběr barev se všemi různými barvami. Vraťte n-tici obsahující barvu dovnitř RGB formát a hexadecimální formát. Pokud si uživatel vybere barvu, použijte konfigurovat způsob nastavení barvy pozadí. Nastavte barvu gumy na stejnou jako barvu pozadí.

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

Definujte metodu, uložit jako. Otevřete dialogové okno souboru s dotazem na uživatele, aby zvolil název souboru a cestu. Pokud uživatel vybere cestu, použijte Pillow's ImageGrab třídy zachytit celou obrazovku. Ořízněte obrázek pomocí zadaných souřadnic, abyste získali oblast plátna. Experimentujte se souřadnicemi, abyste uchopili požadovanou část.

Uložte tento výsledek do požadované cesty k souboru. Zobrazí okno se zprávou, které informuje uživatele, že program úspěšně uložil barvu jako obrázek. V případě jakékoli chyby zobrazí odpovídající chybu.

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

Vytvořte instanci souboru Tk a DrawApp třída. The mainloop() Funkce říká Pythonu, aby spustil smyčku událostí Tkinter a naslouchal událostem, dokud nezavřete okno.

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

Testování různých funkcí malování pomocí Pythonu

Když spustíte program malování, uvidíte aplikaci s paletou barev, čtyřmi tlačítky, jedním posuvníkem a plátnem, na které můžete malovat:

Kliknutím na libovolnou barvu ji vyberete. Poté můžete levým tlačítkem myši kreslit na plátno v této barvě:

Po kliknutí na Guma a přetažením posuvníku svisle nahoru vyberete gumu a zvětšíte její velikost. Otestujte gumu přetažením přes výkres, abyste vymazali tahy.

Když kliknete na Vymazat obrazovku tlačítko, program vymaže váš předchozí výkres. Klikněte na Pozadí otevřete paletu barev a použijte ji ke změně barvy pozadí.

Po kliknutí na Uložit výkres tlačítko, otevře se dialogové okno souboru. Vyberte cestu a název souboru a program jej uloží.

Vylepšení aplikace barvy

Funkčnost aplikace barvy můžete vylepšit přidáním možnosti přidávat tvary. Můžete dát možnost vybrat typ štětce a krytí. Přidejte možnost přidat text a nálepky. Přidejte možnost pro vrácení zpět, opakování, změnu velikosti a převrácení obrázků. Díky tomu bude proces kreslení mnohem plynulejší.

Chcete-li vytvořit tvary, můžete použít metody jako create_rectangle, create_oval, create_line a create_polygon. Chcete-li přidat text a obrázky, použijte metodu create_text a create_image. Chcete-li změnit velikost a převrátit obrázky, můžete použít Pillowovy metody změny velikosti a transpozice.