Das Codieren einer eigenen Paint-App ist eine klassische Übung, bei der Sie viel über die GUI-Programmierung lernen.
Ein einfaches Malwerkzeug ist eine der häufigsten Apps, die Sie auf den meisten Computern finden können. Damit kann der Künstler ohne Angst Fehler machen, auf Knopfdruck eine beliebige Farbe auswählen und die Größe seiner Pinselstriche sofort ändern. Sie können damit Markenlogos erstellen, Benutzeroberflächen konzipieren und Diagramme mit Anmerkungen versehen.
Wie kann man also einen Farbauftrag erstellen?
Das Tkinter- und Pillow-Modul
Um eine Farbanwendung zu erstellen, benötigen Sie die Module Tkinter und Pillow. Tkinter ist einer der Top-Python-Frameworks, mit denen Sie Ihre GUI anpassen können. Es ist das Standard-Python-GUI-Modul zum Erstellen von Desktop-Anwendungen. Tkinter verfügt über eine Vielzahl von Widgets wie Beschriftung, Eintrag, Leinwand und Schaltfläche.
Pillow, ein Zweig der Python Imaging Library (PIL), ist ein Bildverarbeitungsmodul für Python. Mit Pillow können Sie Bilder öffnen, in der Größe ändern, spiegeln und zuschneiden. Du kannst
Dateiformate konvertieren, eine Rezeptsuchanwendung erstellen und Rufen Sie zufällige Bilder ab.Um diese Module zu installieren, führen Sie Folgendes aus:
pip install tk pillow
Definieren Sie die Struktur des Farbauftrags
Den gesamten Quellcode für dieses Projekt finden Sie hier GitHub-Repository.
Beginnen Sie mit dem Import der erforderlichen Module. Definieren Sie eine Klasse, DrawApp. Legen Sie den Titel, die Zeigerfarbe und die Radiererfarbe fest. Öffnen Sie die Anwendung im Vollbildmodus. Ruf den setup_widgets Methode.
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()
Definieren Sie eine aufgerufene Methode setup_widgets. Definieren Sie eine Beschriftung, die eine Überschrift anzeigt. Legen Sie das übergeordnete Element, den anzuzeigenden Text, den Schriftstil, die Hintergrundfarbe und die Textfarbe fest. Definieren Sie einen Rahmen für die Farbpalette. Legen Sie das übergeordnete Element, den anzuzeigenden Text, die Schriftarten und die Rahmenbreite fest. Stellen Sie den Rand so ein, dass er gratartig aussieht, und stellen Sie die Hintergrundfarbe auf Weiß ein.
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)
Definieren Sie einen Satz Farben für die Farbpalette in einer Liste. Iterieren Sie darüber und erstellen Sie für jede davon eine Schaltfläche. Legen Sie das übergeordnete Element, die Hintergrundfarbe, die Rahmenbreite und das Erscheinungsbild fest. Legen Sie außerdem die Breite und den Befehl fest, den jede Schaltfläche ausführen soll, wenn darauf geklickt wird. Ordnen Sie alle Elemente mit entsprechender Polsterung und Farben in Zweiergruppen an.
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
Definieren Sie auf ähnliche Weise eine Schaltfläche für den Radierer, eine zum Löschen des Bildschirms und eine zum Speichern des Bildes.
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,
)
Definieren Sie ein Skalierungs-Widget, um die Größe des Zeigers oder Radierers zu vergrößern oder zu verkleinern. Legen Sie das übergeordnete Element, die Ausrichtung, den Bereich und die Länge in Pixel fest. Definieren Sie eine Leinwand und legen Sie das übergeordnete Element, die Hintergrundfarbe und die Rahmenbreite fest. Stellen Sie das Relief außerdem so ein, dass es zusammen mit seiner Höhe und Breite eine Rillenoptik erhält.
Positionieren Sie die Leinwand mit den entsprechenden Koordinaten und setzen Sie den Anker nach Nordwesten (oben links). Binden Sie die B1-Bewegung zur Malfunktion. B1 bezieht sich auf die gedrückte linke Maustaste und Bewegung bezieht sich auf die Bewegung. Insgesamt nutzen Sie es, um die Mausbewegungen zu verfolgen, während Sie die linke Taste drücken.
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)
Definieren Sie die Funktionen der Farbanwendung
Definieren Sie eine Methode, malen. Zum Malen zeichnet die App kontinuierlich winzige Ovale. Subtrahiere 2 davon X Und j Koordinaten des Mausereignisses, um die obere linke Ecke des Ovals zu bestimmen. Addiere 2, um die untere rechte Ecke des Ovals zu bestimmen. Erstellen Sie mit diesen Begrenzungskoordinaten ein Oval.
Legen Sie die Füllfarbe, die Umrissfarbe und die Breite entsprechend der Auswahl des Zeigers fest.
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(),
)
Definieren Sie drei Funktionen: Wähle Farbe, Radiergummi, Und, klarer_Bildschirm. Der Wähle Farbe Die Methode nimmt eine Farbe an und setzt den Zeiger entsprechend. Der Radiergummi Die Methode stellt den Zeiger so ein, dass er einen radiergummiähnlichen Effekt hat und transparente Linien zeichnet. Der klarer_Bildschirm Die Methode löscht alle Elemente auf der Leinwand.
defselect_color(self, col):
self.pointer = coldeferaser(self):
self.pointer = self.erase
defclear_screen(self):
self.canvas.delete("all")
Definieren Sie eine Methode, Leinwandfarbe. Öffnen Sie eine Farbauswahl mit allen verschiedenen Farben. Gibt ein Tupel zurück, das die Farbe enthält RGB Format und Hexadezimalformat. Wenn der Benutzer eine Farbe auswählt, verwenden Sie die konfigurieren Methode zum Festlegen der Hintergrundfarbe. Stellen Sie die Farbe des Radierers auf die gleiche Farbe wie die Hintergrundfarbe ein.
defcanvas_color(self):
color = colorchooser.askcolor()
if color:
self.canvas.configure(background=color[1])
self.erase = color[1]
Definieren Sie eine Methode, speichern als. Öffnen Sie ein Dateidialogfeld, in dem der Benutzer aufgefordert wird, den Dateinamen und den Pfad auszuwählen. Wenn der Benutzer einen Pfad auswählt, verwenden Sie Pillow's ImageGrab Klasse, um den gesamten Bildschirm zu erfassen. Beschneiden Sie das Bild mit den angegebenen Koordinaten, um den Leinwandbereich zu erhalten. Experimentieren Sie mit den Koordinaten, um das gewünschte Teil zu finden.
Speichern Sie dieses Ergebnis im gewünschten Dateipfad. Zeigt ein Meldungsfeld an, das den Benutzer darüber informiert, dass das Programm die Farbe erfolgreich als Bild gespeichert hat. Im Fehlerfall wird der entsprechende Fehler angezeigt.
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}")
Erstellen Sie eine Instanz von Tk und das DrawApp Klasse. Der Hauptschleife() Die Funktion weist Python an, die Tkinter-Ereignisschleife auszuführen und auf Ereignisse zu warten, bis Sie das Fenster schließen.
if __name__ == "__main__":
root = tk.Tk()
app = DrawApp(root)
root.mainloop()
Testen verschiedener Malfunktionen mit Python
Wenn Sie das Malprogramm ausführen, sehen Sie eine App mit einer Farbpalette, vier Schaltflächen, einem Schieberegler und einer Leinwand zum Malen:
Klicken Sie auf eine beliebige Farbe, um sie auszuwählen. Anschließend können Sie mit der linken Maustaste in dieser Farbe auf der Leinwand zeichnen:
Beim Klicken auf Radiergummi Klicken Sie auf die Schaltfläche und ziehen Sie den Schieberegler vertikal nach oben, um den Radiergummi auszuwählen und seine Größe zu erhöhen. Testen Sie den Radierer, indem Sie ihn über Ihre Zeichnung ziehen, um die Striche zu löschen.
Wenn Sie auf klicken Klarer Bildschirm Klicken Sie auf die Schaltfläche, das Programm löscht Ihre vorherige Zeichnung. Drücke den Hintergrund Klicken Sie auf die Schaltfläche, um eine Farbpalette zu öffnen und diese zum Ändern der Hintergrundfarbe zu verwenden.
Beim Klicken auf Zeichnung speichern Klicken Sie auf die Schaltfläche, um ein Dateidialogfeld zu öffnen. Wählen Sie einen Pfad und Namen für die Datei und das Programm speichert sie.
Verbesserung des Farbauftrags
Sie können die Funktionalität des Farbauftrags erweitern, indem Sie eine Option zum Hinzufügen von Formen hinzufügen. Sie können eine Option zur Auswahl des Pinseltyps und der Deckkraft angeben. Fügen Sie eine Option zum Hinzufügen von Text und Aufklebern hinzu. Fügen Sie eine Option zum Rückgängigmachen, Wiederherstellen, Ändern der Größe und Spiegeln von Bildern hinzu. Dadurch wird der Zeichenvorgang viel reibungsloser.
Zum Erstellen von Formen können Sie Methoden wie create_rectangle, create_oval, create_line und create_polygon verwenden. Um Text und Bilder hinzuzufügen, verwenden Sie die Methoden create_text und create_image. Um die Größe von Bildern zu ändern und sie zu spiegeln, können Sie die Größenänderungs- und Transponierungsmethoden von Pillow verwenden.