Contents

如何使用 Python 構建 Paint 應用程序

簡單的繪畫工具是大多數計算機上最常見的應用程序之一。它讓藝術家不用擔心犯錯誤,只需單擊按鈕即可選擇任何顏色,並立即更改畫筆描邊的大小。您可以使用它來創建品牌徽標、概念化用戶界面以及註釋圖表。

可以通過什麼方式構建一個繪畫軟件程序?

Tkinter 和 Pillow 模塊

為了使用Python開發繪畫應用程序,系統中必須安裝Tkinter和Pillow模塊。在為基於 Python 的桌面應用程序設計圖形用戶界面 (GUI) 時,Tkinter 框架是最流行的選擇之一。該框架提供了各種內置小部件,例如標籤、文本框、畫布和按鈕,使開發人員能夠快速輕鬆地創建具有視覺吸引力的交互式界面。

Pillow 是久負盛名的 Python 圖像庫 (PIL) 的衍生版本,可作為 Python 應用程序的多功能圖像處理工具包。利用其功能,用戶可以輕鬆地對數字視覺媒體執行各種操作,例如打開、調整大小、旋轉和裁剪圖像。此外,該庫還有助於格式轉換,支持開發食譜推薦系統等複雜算法,並提供從數據庫中隨機檢索圖像的功能。

要安裝這些模塊,請運行:

 pip install tk pillow 

定義 Paint 應用程序的結構

該項目的完整源代碼可在我們的 GitHub 存儲庫中找到,您可以通過導航到上述 URL 來訪問該存儲庫。

首先,我們將導入必要的模塊。隨後,我們將創建一個 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) 

創建一個列表來定義調色板的一組顏色。利用迭代為每種色調生成一個按鈕,同時考慮其相應的 RGB 值。指定每個按鈕的父容器、背景陰影、邊框厚度、樣式屬性和寬度。此外,確定單擊每個操作時將執行的操作。使用適當的邊距排列所有組件,並成對組織顏色。

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

為了創建一個可以在指定範圍和像素長度內調整指針和橡皮擦大小的自定義縮放小部件,需要定義一個縮放小部件。應為該小部件指定一個父元素、方向、像素範圍以及滑塊的長度。此外,包含一個具有自己的父元素、背景顏色、邊框寬度和具有特定尺寸的凹槽浮雕的 Canvas 元素將是有益的。

將畫布放置在合適的坐標處,並將其錨定到西北角(左上角)。隨後,將 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”的方法。這種方法涉及在屏幕上連續繪製小橢圓形狀。為了實現這一點,我們通過從最近鼠標事件的 X 和 Y 坐標中減去 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\_coloreraserclear\_screen 。這些方法中的每一個在操作畫布的外觀和內容方面都有其獨特的目的。 select_color 函數接受表示特定顏色值的單個參數,然後使用該參數設置指針繪製的當前顏色。這樣就可以根據需要輕鬆選擇不同的顏色。 pythondef select_color(self, color):self.selected_color=color 接下來,我們有 eraser 函數,它也只需要一個輸入參數。它負責在畫布上繪圖時創建“橡皮擦”效果,從而產生混合的半透明線條

     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 方法提供的功能合併到 TurtleScreen 類中,以便它打開一個顏色選擇器,顯示各種色調供用戶選擇。做出選擇後,使用configure方法來建立畫布的背景顏色,然後將該顏色應用於橡皮擦的外觀。

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

將提供的步驟合併到優雅的英語響應中:“定義一個名為‘save\_as’的方法,它提示用戶選擇文件名和位置來保存捕獲的屏幕截圖。利用 Pillow 的 ImageGrab 類通過顯示文件對話框來佔據整個屏幕。選擇後,使用指定坐標採用裁剪技術來獲得所需的畫佈區域。根據需要迭代調整坐標以獲得特定的感興趣區域。

當然!這是我嘗試用更正式的語言解釋您的代碼:pythondef save_image(filepath):try:p=PILImage.create(filename=filepath)if isinstance(p, ImageGrab.InvalidGrab):raise Exception(“無法加載圖像” )# 保存圖像並顯示確認消息boxp.save(str(filepath))tkinter.messagebox.showinfo(‘Success’,‘圖像已保存’) except Exception as e:# 處理異常並顯示錯誤消息boxtkinter.messagebox.showerror (‘錯誤’, str(e))

     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 類的實例來利用 Tkinter 模塊的功能,同時利用 mainloop 方法提供的功能來啟動 Tkinter 事件循環並持續監視用戶與圖形界面的交互,直到其關閉。

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

使用 Python 測試不同的繪畫功能

執行 Paint 應用程序後,用戶將看到一個圖形用戶界面,其中包含顏色選擇工具、四個功能鍵、滑動調整控件以及用於創建圖稿的空白畫布表面:

/bc/images/initial-screen-of-paint-application.jpg

通過單擊選擇一種色調,然後使用鼠標左鍵單擊按鈕在畫布表面上的所選色調內創建藝術品:

/bc/images/drawing-using-different-paint-colors.jpg

單擊“橡皮擦”選項並向上滑動垂直滑塊,可以選擇放大橡皮擦工具。要測試其功能,只需使用所選畫筆進行繪製,然後使用橡皮擦刪除圖稿中的線條即可。

/bc/images/increasing-size-and-erasing-in-middle.jpg

單擊“清除屏幕”選項時,該軟件將清除任何以前執行的藝術作品。要修改背景色調,請點擊“背景”選項卡,該選項卡將顯示可供選擇的顏色光譜。

/bc/images/clearing-the-screen-and-adding-background-color.jpg

選擇“保存繪圖”選項後,將出現一個窗口,允許您選擇所需位置並為保存的文件指定標題。然後軟件會自動將文件存儲在指定的目錄中。

/bc/images/saving-the-paint-as-an-image.jpg

增強塗料應用

為了增加繪畫軟件的多功能性,建議實現一項功能,允許用戶將幾何形式合併到他們的藝術作品中。此外,提供選擇畫筆樣式和透明度設置的選項將進一步擴展程序的功能。此外,集成能夠插入文本和圖形貼紙的功能可能有助於擴大潛在創作的範圍。最後,撤消、重做、縮放或旋轉圖像等功能的結合將顯著簡化整個繪圖過程。

為了生成各種視覺元素,可以採用多種技術,使用 create\_rectangle、create\_oval、create\_line 和 create\_polygon 方法。另外,為了合併書面內容或圖像,可以利用 create\_text 和 create\_image 函數。此外,如果需要,Pillow 的調整大小和轉置功能可用於改變圖像的尺寸和方向。