Кодирането на вашето собствено приложение за рисуване е класическо упражнение, което ще ви научи много за програмирането с GUI.

Прост инструмент за рисуване е едно от най-често срещаните приложения, които можете да намерите на повечето компютри. Позволява на художника да прави грешки без страх, да избира всеки цвят с едно щракване на бутон и да променя незабавно размера на мазките на четката си. Можете да го използвате за създаване на лога на марката, концептуализиране на потребителски интерфейси и анотиране на диаграми.

И така, как можете да създадете приложение за рисуване?

Модулът Tkinter и Pillow

За да създадете приложение за рисуване, ще ви трябват модулите Tkinter и Pillow. Tkinter е един от горе Python рамки, които можете да използвате, за да персонализирате вашия GUI. Това е стандартният GUI модул на Python за създаване на десктоп приложения. Tkinter идва с различни джаджи като етикет, запис, платно и бутон.

Pillow, разклонение на Python Imaging Library (PIL), е модул за обработка на изображения за Python. С Pillow можете да отваряте, преоразмерявате, обръщате и изрязвате изображения. Можеш

instagram viewer
конвертиране на файлови формати, създайте приложение за намиране на рецепти и извличане на произволни изображения.

За да инсталирате тези модули, изпълнете:

pip install tk pillow

Определете структурата на приложението Paint

Можете да намерите целия изходен код за този проект тук GitHub хранилище.

Започнете с импортиране на необходимите модули. Определете клас, DrawApp. Задайте заглавието, цвета на показалеца и цвета на гумичката. Отворете приложението на цял екран. Обадете се на setup_widgets метод.

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

Дефинирайте метод, наречен setup_widgets. Дефинирайте етикет, който показва заглавие. Задайте родителския елемент, текста, който искате да покажете, стила на шрифта, цвета на фона и цвета на текста. Определете рамка за цветовата палитра. Задайте родителския елемент, текста, който трябва да показва, стиловете на шрифта и ширината на рамката. Задайте границата да изглежда като хребет и цвета на фона да е бял.

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)

Определете набор от цветове за цветовата палитра в списък. Итерирайте го и създайте бутон за всеки от тях. Задайте родителския елемент, цвета на фона, ширината на рамката и външния вид. Също така задайте ширината и командата, която всеки бутон трябва да изпълнява при щракване. Организирайте всички елементи с подходяща подложка и цветовете в комплекти по два.

 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

По същия начин дефинирайте бутон за изтриване, един за изчистване на екрана и един за запазване на изображението.

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

Дефинирайте графичен модул за мащабиране, за да увеличите или намалите размера на показалеца или гумичката. Задайте родителския елемент, ориентацията, диапазона и дължината в пиксели. Дефинирайте платно и задайте родителския елемент, цвета на фона и ширината на рамката. Също така настройте релефа да изглежда като жлеб заедно с неговата височина и ширина.

Позиционирайте платното с подходящи координати и поставете котвата на северозапад (горе вляво). Свържете B1-Движение към функцията за боядисване. B1 се отнася до левия бутон на мишката, задържан натиснат и Движение се отнася до движението. Като цяло го използвате за проследяване на движението на мишката, докато натискате левия бутон.

 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)

Определете характеристиките на приложението Paint

Определете метод, боя. За да рисува, приложението непрекъснато ще рисува малки овали. Извадете 2 от х и г координати на събитието с мишката, за да определите горния ляв ъгъл на овала. Добавете 2, за да определите долния десен ъгъл на овала. Създайте овал, като използвате тези гранични координати.

Задайте цвета на запълване, цвета на контура и ширината според избора на показалеца.

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

Определете три функции, изберете цвят, гумичка, и, чист_екран. The изберете цвят методът взема цвят и съответно настройва показалеца. The гумичка методът настройва показалеца да има ефект, подобен на гумичка, и го кара да рисува прозрачни линии. The чист_екран метод изтрива всички елементи на платното.

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

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

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

Определете метод, цвят_на_платното. Отворете инструмент за избор на цвят с всички различни цветове. Връща кортеж, съдържащ цвета в RGB формат и шестнадесетичен формат. Ако потребителят избере цвят, използвайте конфигурирайте метод за задаване на цвета на фона. Задайте цвета на гумичката като цвета на фона.

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

Определете метод, Запази като. Отворете диалогов прозорец за файл, като поискате от потребителя да избере името на файла и пътя. Ако потребителят избере път, използвайте Pillow's ImageGrab клас за заснемане на целия екран. Изрежете изображението, като използвате посочените координати, за да получите областта на платното. Експериментирайте с координатите, за да вземете желаната част.

Запазете този резултат в желания път до файла. Покажете поле със съобщение, което информира потребителя, че програмата успешно е запазила рисуването като изображение. В случай на грешка, той показва съответната грешка.

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

Създайте екземпляр на Tk и на DrawApp клас. The mainloop() функцията казва на Python да стартира цикъла на събитията на Tkinter и да слуша за събития, докато затворите прозореца.

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

Тестване на различни функции за рисуване с помощта на Python

Когато стартирате програмата за рисуване, ще видите приложение с цветова палитра, четири бутона, един плъзгач и платно, върху което да рисувате:

Щракнете върху произволен цвят, за да го изберете. След това можете да рисувате върху платното в този цвят с левия бутон на мишката:

При щракване върху Гумичка и плъзнете плъзгача вертикално нагоре, ще изберете гумичката и ще увеличите нейния размер. Тествайте гумата, като я плъзнете върху рисунката си, за да изтриете щрихите.

Когато щракнете върху Изчистване на екрана бутон, програмата изчиства предишния ви чертеж. Щракнете върху Заден план бутон, за да отворите цветова палитра и да я използвате, за да промените цвета на фона.

При щракване върху Запазване на чертежа бутон, се отваря диалогов прозорец за файл. Изберете път и име за файла и програмата ще го запази.

Подобряване на приложението Paint

Можете да подобрите функционалността на приложението за рисуване, като добавите опция за добавяне на форми. Можете да дадете опция за избор на тип четка и непрозрачност. Добавете опция за добавяне на текст и стикери. Добавете опция за отмяна, повторение, преоразмеряване и обръщане на изображения. Това ще направи процеса на рисуване много по-гладък.

За да създавате форми, можете да използвате методи като create_rectangle, create_oval, create_line и create_polygon. За да добавите текст и изображения, използвайте метода create_text и create_image. За да преоразмерите и обърнете изображения, можете да използвате методите за преоразмеряване и транспониране на Pillow.