Kodowanie własnej aplikacji do malowania to klasyczne ćwiczenie, które nauczy Cię wiele o programowaniu GUI.
Proste narzędzie do malowania to jedna z najpopularniejszych aplikacji, które można znaleźć na większości komputerów. Pozwala artyście bez obaw popełniać błędy, wybierać dowolny kolor jednym kliknięciem i błyskawicznie zmieniać wielkość pociągnięć pędzla. Można go używać do tworzenia logo marki, konceptualizacji interfejsów użytkownika i opisywania diagramów.
Jak zatem zbudować aplikację do malowania?
Moduł Tkinter i poduszka
Aby zbudować aplikację do malowania, będziesz potrzebować modułów Tkinter i Pillow. Tkinter jest jednym z najlepsze frameworki Pythona, których możesz użyć do dostosowania swojego GUI. Jest to standardowy moduł GUI języka Python do tworzenia aplikacji komputerowych. Tkinter zawiera wiele widżetów, takich jak etykieta, wpis, płótno i przycisk.
Pillow, rozwidlenie Python Imaging Library (PIL), to moduł do przetwarzania obrazu dla Pythona. Dzięki Pillow możesz otwierać, zmieniać rozmiar, odwracać i przycinać obrazy. Możesz
konwertować formaty plików, zbuduj aplikację do wyszukiwania przepisów i pobieraj losowe obrazy.Aby zainstalować te moduły, uruchom:
pip install tk pillow
Zdefiniuj strukturę aplikacji farby
Cały kod źródłowy tego projektu znajdziesz w this Repozytorium GitHuba.
Rozpocznij od zaimportowania wymaganych modułów. Zdefiniuj klasę, RysujAplikację. Ustaw tytuł, kolor wskaźnika i kolor gumki. Otwórz aplikację na pełnym ekranie. Zadzwoń do 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()
Zdefiniuj metodę o nazwie setup_widgets. Zdefiniuj etykietę wyświetlającą nagłówek. Ustaw element nadrzędny, tekst, który chcesz wyświetlić, styl czcionki, kolor tła i kolor tekstu. Zdefiniuj ramkę dla palety kolorów. Ustaw element nadrzędny, tekst, który ma być wyświetlany, style czcionek i szerokość obramowania. Ustaw obramowanie tak, aby miało wygląd przypominający grzbiet, a kolor tła był biały.
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)
Zdefiniuj zestaw kolorów dla palety kolorów na liście. Iteruj po nim i utwórz przycisk dla każdego z nich. Ustaw element nadrzędny, kolor tła, szerokość obramowania i wygląd. Ustaw także szerokość i polecenie, które każdy przycisk powinien uruchamiać po kliknięciu. Uporządkuj wszystkie elementy za pomocą odpowiedniego wypełnienia i kolorów w zestawach po dwa.
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
Podobnie zdefiniuj przycisk gumki, jeden do czyszczenia ekranu i jeden do zapisywania obrazu.
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,
)
Zdefiniuj widżet skali, aby zwiększyć lub zmniejszyć rozmiar wskaźnika lub gumki. Ustaw element nadrzędny, orientację, zakres i długość w pikselach. Zdefiniuj płótno i ustaw element nadrzędny, kolor tła i szerokość obramowania. Ustaw także relief tak, aby miał wygląd rowka wraz z jego wysokością i szerokością.
Ustaw płótno o odpowiednich współrzędnych i ustaw kotwicę na północny zachód (lewy górny róg). Zwiąż B1-Ruch do funkcji malowania. B1 odnosi się do wciśniętego lewego przycisku myszy i Ruch odnosi się do ruchu. Ogólnie rzecz biorąc, używasz go do śledzenia ruchu myszy po naciśnięciu lewego przycisku.
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)
Zdefiniuj cechy aplikacji Paint
Zdefiniuj metodę, farba. Aby malować, aplikacja będzie stale rysować drobne owale. Odejmij 2 od X I y współrzędne zdarzenia myszy w celu określenia lewego górnego rogu owalu. Dodaj 2, aby określić prawy dolny róg owalu. Utwórz owal, korzystając z tych współrzędnych ograniczających.
Ustaw kolor wypełnienia, kolor konturu i szerokość zgodnie z wyborem wskaźnika.
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(),
)
Zdefiniuj trzy funkcje, Wybierz kolor, gumka do mazania, I, czysty ekran. The Wybierz kolor Metoda pobiera kolor i odpowiednio ustawia wskaźnik. The gumka do mazania Metoda ustawia wskaźnik tak, aby działał jak gumka i rysował przezroczyste linie. The czysty ekran Metoda usuwa wszystkie elementy na kanwie.
defselect_color(self, col):
self.pointer = coldeferaser(self):
self.pointer = self.erase
defclear_screen(self):
self.canvas.delete("all")
Zdefiniuj metodę, kolor płótna. Otwórz selektor kolorów ze wszystkimi różnymi kolorami. Zwróć krotkę zawierającą kolor RGB formacie i formacie szesnastkowym. Jeśli użytkownik wybierze kolor, użyj opcji skonfiguruj metoda ustawiania koloru tła. Ustaw kolor gumki na taki sam jak kolor tła.
defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]
Zdefiniuj metodę, Zapisz jako. Otwórz okno dialogowe pliku, prosząc użytkownika o wybranie nazwy pliku i ścieżki. Jeśli użytkownik wybierze ścieżkę, użyj Pillow Przechwytywanie obrazu class, aby przechwycić cały ekran. Przytnij obraz, używając określonych współrzędnych, aby uzyskać obszar płótna. Eksperymentuj ze współrzędnymi, aby chwycić żądaną część.
Zapisz ten wynik w żądanej ścieżce pliku. Wyświetla okno komunikatu informujące użytkownika, że program pomyślnie zapisał farbę jako obraz. W przypadku jakiegokolwiek błędu wyświetla odpowiedni błąd.
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}")
Utwórz instancję Tk i RysujAplikację klasa. The główna pętla() funkcja mówi Pythonowi, aby uruchomił pętlę zdarzeń Tkinter i nasłuchiwał zdarzeń, dopóki nie zamkniesz okna.
if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()
Testowanie różnych funkcji malowania przy użyciu języka Python
Po uruchomieniu programu do malowania zobaczysz aplikację z paletą kolorów, czterema przyciskami, jednym suwakiem i obszarem do malowania:
Kliknij dowolny kolor, aby go wybrać. Następnie możesz rysować na płótnie w tym kolorze lewym przyciskiem myszy:
Po kliknięciu gumka do mazania i przeciągając suwak pionowo w górę, wybierzesz gumkę i zwiększysz jej rozmiar. Przetestuj gumkę, przeciągając ją po rysunku, aby usunąć pociągnięcia.
Kiedy klikniesz Czysty ekran przycisk, program usunie poprzedni rysunek. Kliknij Tło aby otworzyć paletę kolorów i za jej pomocą zmienić kolor tła.
Po kliknięciu Zapisz rysunek przycisk, otwiera się okno dialogowe pliku. Wybierz ścieżkę i nazwę pliku, a program go zapisze.
Ulepszanie aplikacji farby
Możesz zwiększyć funkcjonalność aplikacji Paint, dodając opcję dodawania kształtów. Możesz dać opcję wyboru rodzaju pędzla i krycia. Dodaj opcję dodawania tekstu i naklejek. Dodaj opcję cofania, ponawiania, zmiany rozmiaru i odwracania obrazów. Dzięki temu proces rysowania będzie znacznie płynniejszy.
Do tworzenia kształtów można używać metod takich jak create_rectangle, create_oval, create_line i create_polygon. Aby dodać tekst i obrazy, użyj metod create_text i create_image. Aby zmienić rozmiar i odwrócić obrazy, możesz użyć metod zmiany rozmiaru i transpozycji Pillow.