خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه با استفاده از پایتون یک اپلیکیشن رنگ بسازیم

کدنویسی اپلیکیشن رنگ خود یک تمرین کلاسیک است که در مورد برنامه نویسی رابط کاربری گرافیکی چیزهای زیادی به شما می آموزد.

ابزار رنگ آمیزی ساده یکی از رایج ترین برنامه هایی است که می توانید در اکثر رایانه ها پیدا کنید. این به هنرمند اجازه می دهد بدون ترس اشتباه کند، هر رنگی را با کلیک یک دکمه انتخاب کند و فوراً اندازه قلم مو را تغییر دهد. می توانید از آن برای ایجاد لوگوهای برند، مفهوم سازی رابط های کاربری و حاشیه نویسی نمودارها استفاده کنید.

بنابراین، چگونه می توانید یک برنامه رنگ بسازید؟

ماژول Tkinter و Pillow

برای ساختن یک برنامه رنگ، به ماژول های Tkinter و Pillow نیاز دارید. Tkinter یکی از فریمورک‌های برتر پایتون است که می‌توانید برای شخصی‌سازی رابط کاربری گرافیکی خود از آن استفاده کنید. این ماژول استاندارد رابط کاربری گرافیکی پایتون برای ایجاد برنامه های دسکتاپ است. Tkinter با انواع ویجت ها مانند برچسب، ورودی، بوم و دکمه ارائه می شود.

Pillow، شاخه ای از کتابخانه تصویربرداری پایتون (PIL)، یک ماژول پردازش تصویر برای پایتون است. با Pillow می توانید تصاویر را باز کنید، اندازه آن را تغییر دهید، ورق بزنید و برش دهید. می‌توانید فرمت‌های فایل را تبدیل کنید، یک برنامه دستور یاب بسازید، و تصاویر تصادفی را واکشی کنید.

برای نصب این ماژول ها، اجرا کنید:

pip install tk pillow

ساختار برنامه رنگ را تعریف کنید

شما می توانید کل کد منبع این پروژه را در این مخزن GitHub پیدا کنید.

با وارد کردن ماژول های مورد نیاز شروع کنید. یک کلاس تعریف کنید، DrawApp. عنوان، رنگ اشاره گر و رنگ پاک کن را تنظیم کنید. برنامه را به صورت تمام صفحه باز کنید. متد setup_widgets را فراخوانی کنید.

import tkinter as tk
from tkinter.ttk import Scale
from tkinter import colorchooser, filedialog, messagebox
import PIL.ImageGrab as ImageGrab

class DrawApp:
    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 تعریف کنید. برچسبی را تعریف کنید که عنوانی را نمایش دهد. عنصر والد، متنی که می خواهید نمایش داده شود، سبک فونت، رنگ پس زمینه و رنگ متن را تنظیم کنید. یک قاب برای پالت رنگ تعریف کنید. عنصر والد، متنی که باید نمایش داده شود، سبک های فونت و عرض حاشیه را تنظیم کنید. حاشیه را طوری تنظیم کنید که ظاهری رج مانند داشته باشد و رنگ پس‌زمینه را سفید باشد.

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

یک ویجت مقیاس برای افزایش یا کاهش اندازه اشاره گر یا پاک کن تعریف کنید. عنصر والد، جهت، محدوده و طول را بر حسب پیکسل تنظیم کنید. یک بوم را تعریف کنید و عنصر والد، رنگ پس‌زمینه و عرض حاشیه را تنظیم کنید. همچنین نقش برجسته را به همراه ارتفاع و عرض آن به گونه ای تنظیم کنید که ظاهر شیاری داشته باشد.

مطلب مرتبط:   نحوه ایجاد یک فرم ورود خودکار داده در Excel VBA

بوم را با مختصات مناسب قرار دهید و لنگر را در سمت شمال غربی (بالا سمت چپ) قرار دهید. B1-Motion را به تابع رنگ متصل کنید. B1 به دکمه چپ ماوس و Motion به حرکت اشاره دارد. به طور کلی، در حالی که دکمه سمت چپ را فشار می دهید، از آن برای ردیابی حرکت ماوس استفاده می کنید.

        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("<B1-Motion>", self.paint)

ویژگی های برنامه Paint را تعریف کنید

یک روش تعریف کنید، رنگ کنید. برای نقاشی، برنامه به طور مداوم بیضی های دقیقه ای را ترسیم می کند. 2 را از مختصات x و y رویداد ماوس کم کنید تا گوشه سمت چپ بالای بیضی مشخص شود. برای مشخص کردن گوشه سمت راست پایین بیضی، 2 اضافه کنید. با استفاده از این مختصات مرزی یک بیضی ایجاد کنید.

رنگ پر، رنگ طرح کلی و عرض را مطابق با انتخاب اشاره گر تنظیم کنید.

    def paint(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، eraser و clear_screen را تعریف کنید. متد select_color یک رنگ می گیرد و نشانگر را بر اساس آن تنظیم می کند. روش پاک کن نشانگر را به گونه ای تنظیم می کند که یک اثر پاک کن داشته باشد و باعث می شود خطوط شفاف بکشد. روش clear_screen تمام موارد روی بوم را حذف می کند.

    def select_color(self, col):
        self.pointer = col

    def eraser(self):
        self.pointer = self.erase

    def clear_screen(self):
        self.canvas.delete("all")

یک متد، canvas_color تعریف کنید. انتخابگر رنگ را با تمام رنگ های مختلف باز کنید. یک تاپل حاوی رنگ در قالب RGB و فرمت هگزادسیمال را برگردانید. اگر کاربر رنگی را انتخاب کرد، از روش پیکربندی برای تنظیم رنگ پس زمینه استفاده کنید. رنگ پاک کن را با رنگ پس زمینه یکسان کنید.

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

یک متد تعریف کنید save_as. یک کادر محاوره ای فایل را باز کنید و از کاربر بخواهید نام و مسیر فایل را انتخاب کند. اگر کاربر مسیری را انتخاب کرد، از کلاس ImageGrab Pillow برای گرفتن کل صفحه استفاده کنید. برای بدست آوردن ناحیه بوم، تصویر را با استفاده از مختصات مشخص شده برش دهید. با مختصات آزمایش کنید تا قسمت مورد نظر را بگیرید.

مطلب مرتبط:   چگونه یک نوار پیشرفت قابل دسترسی با React ایجاد کنیم

این نتیجه را در مسیر فایل مورد نظر ذخیره کنید. کادر پیامی را نمایش دهید که به کاربر اطلاع می دهد که برنامه با موفقیت رنگ را به عنوان تصویر ذخیره کرده است. در صورت بروز هر گونه خطایی، خطای مربوطه را نمایش می دهد.

    def save_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 ایجاد کنید. تابع mainloop() به پایتون می گوید که حلقه رویداد Tkinter را اجرا کند و تا زمانی که پنجره را ببندید به رویدادها گوش دهد.

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

آزمایش ویژگی های مختلف نقاشی با استفاده از پایتون

هنگامی که برنامه paint را اجرا می کنید، یک برنامه با یک پالت رنگ، چهار دکمه، یک نوار لغزنده و یک بوم برای نقاشی می بینید:

صفحه اولیه کاربرد رنگ

برای انتخاب هر رنگی کلیک کنید. سپس می توانید با دکمه سمت چپ ماوس روی بوم به آن رنگ بکشید:

طراحی با استفاده از رنگ های مختلف

با کلیک بر روی دکمه Eraser و کشیدن نوار لغزنده به صورت عمودی به سمت بالا، پاک کن را انتخاب کرده و اندازه آن را افزایش می دهید. پاک کن را با کشیدن آن روی نقاشی خود امتحان کنید تا سکته ها پاک شوند.

افزایش اندازه و پاک کردن در وسط

وقتی روی دکمه Clear Screen کلیک می کنید، برنامه نقشه قبلی شما را پاک می کند. روی دکمه Background کلیک کنید تا یک پالت رنگ باز شود و از آن برای تغییر رنگ پس زمینه استفاده کنید.

مطلب مرتبط:   نحوه ادغام Feature Flags در برنامه های React با استفاده از Flagsmith

پاک کردن صفحه و اضافه کردن رنگ پس زمینه

با کلیک بر روی دکمه Save Drawing، کادر محاوره ای فایل باز می شود. یک مسیر و نام برای فایل انتخاب کنید و برنامه آن را ذخیره خواهد کرد.

ذخیره رنگ به عنوان تصویر

افزایش کاربرد رنگ

می توانید با افزودن گزینه ای برای افزودن اشکال، عملکرد برنامه رنگ را افزایش دهید. شما می توانید گزینه ای برای انتخاب نوع قلم مو و کدورت ارائه دهید. گزینه ای برای افزودن متن و برچسب اضافه کنید. گزینه‌ای برای لغو، انجام مجدد، تغییر اندازه و برگرداندن تصاویر اضافه کنید. این باعث می شود که روند نقاشی بسیار روان تر شود.

برای ایجاد اشکال می توانید از روش هایی مانند create_rectangle، create_oval، create_line و create_polygon استفاده کنید. برای افزودن متن و تصویر از متد create_text و create_image استفاده کنید. برای تغییر اندازه و ورق زدن تصاویر، می توانید از روش های تغییر اندازه و جابجایی بالش استفاده کنید.