Написание собственного приложения для рисования — это классическое упражнение, которое научит вас многому в программировании графического пользовательского интерфейса.
Простой инструмент для рисования — одно из самых распространенных приложений, которые можно найти на большинстве компьютеров. Он позволяет художнику без страха совершать ошибки, выбирать любой цвет одним нажатием кнопки и мгновенно менять размер мазков кисти. Вы можете использовать его для создания логотипов брендов, концептуализации пользовательских интерфейсов и аннотирования диаграмм.
Итак, как же создать приложение для рисования?
Модуль Tkinter и Pillow
Чтобы создать приложение для рисования, вам понадобятся модули Tkinter и Pillow. Ткинтер — один из лучшие фреймворки Python, которые вы можете использовать для настройки своего графического интерфейса. Это стандартный модуль графического интерфейса Python для создания настольных приложений. Tkinter поставляется с различными виджетами, такими как метка, запись, холст и кнопка.
Pillow, ответвление библиотеки изображений Python (PIL), представляет собой модуль обработки изображений для Python. С помощью Pillow вы можете открывать, изменять размер, переворачивать и обрезать изображения. Ты можешь конвертировать форматы файлов, создать приложение для поиска рецептов и получить случайные изображения.
Чтобы установить эти модули, запустите:
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-Движение к функции рисования. Б1 относится к удерживанию левой кнопки мыши и Движение относится к движению. В целом, вы используете его для отслеживания движения мыши, когда нажимаете левую кнопку.
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(),
)
Определите три функции, select_color, ластик, и, очисти экран. select_color Метод принимает цвет и соответствующим образом устанавливает указатель. ластик Метод устанавливает указатель на эффект ластика и заставляет его рисовать прозрачные линии. очисти экран метод удаляет все элементы на холсте.
defselect_color(self, col):
self.pointer = coldeferaser(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 ИзображениеGrab класс для захвата всего экрана. Обрежьте изображение, используя указанные координаты, чтобы получить область холста. Поэкспериментируйте с координатами, чтобы захватить нужную часть.
Сохраните этот результат по нужному пути к файлу. Отображение окна сообщения, информирующего пользователя о том, что программа успешно сохранила краску как изображение. В случае какой-либо ошибки отображается соответствующая ошибка.
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}")
Создайте экземпляр Тк и DrawApp сорт. основной цикл() Функция сообщает 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.