QuantumSketchpad Python GUI

👤 Sharing: AI
import tkinter as tk
from tkinter import ttk, colorchooser, filedialog, messagebox
from PIL import Image, ImageDraw, ImageTk
import random
import json

class QuantumSketchpad:
    def __init__(self, root):
        self.root = root
        self.root.title("QuantumSketchpad - Unleash Your Creativity")

        # Initial Brush Settings
        self.brush_width = 5
        self.brush_color = "black"
        self.canvas_color = "white"
        self.drawing_tool = "brush" #brush, line, rectangle, ellipse
        self.current_image = None # Store PIL Image for saving

        # UI Elements
        self.create_widgets()

        # Canvas Setup
        self.canvas.bind("<B1-Motion>", self.paint)
        self.canvas.bind("<ButtonRelease-1>", self.reset)
        self.canvas.bind("<Button-1>", self.start_drawing)

        self.old_x = None
        self.old_y = None
        self.eraser_on = False


    def create_widgets(self):
        # Frame for Controls
        controls_frame = ttk.Frame(self.root, padding=10)
        controls_frame.pack(side=tk.TOP, fill=tk.X)

        # Brush Width
        ttk.Label(controls_frame, text="Brush Size:").grid(row=0, column=0, padx=5)
        self.brush_width_scale = ttk.Scale(controls_frame, from_=1, to=50, orient=tk.HORIZONTAL, command=self.change_brush_size)
        self.brush_width_scale.set(self.brush_width)
        self.brush_width_scale.grid(row=0, column=1, padx=5)

        # Brush Color
        ttk.Button(controls_frame, text="Brush Color", command=self.choose_color).grid(row=0, column=2, padx=5)

        # Canvas Color
        ttk.Button(controls_frame, text="Canvas Color", command=self.choose_canvas_color).grid(row=0, column=3, padx=5)

        # Drawing Tool Selection
        tool_label = ttk.Label(controls_frame, text="Drawing Tool:")
        tool_label.grid(row=0, column=4, padx=5)
        self.tool_combo = ttk.Combobox(controls_frame, values=["brush", "line", "rectangle", "ellipse"], state="readonly")
        self.tool_combo.set(self.drawing_tool)
        self.tool_combo.grid(row=0, column=5, padx=5)
        self.tool_combo.bind("<<ComboboxSelected>>", self.change_drawing_tool)

        # Eraser Button
        self.eraser_button = ttk.Checkbutton(controls_frame, text="Eraser", command=self.toggle_eraser)
        self.eraser_button.grid(row=0, column=6, padx=5)

        #Save Button
        ttk.Button(controls_frame, text ="Save", command = self.save_image).grid(row=0,column=7, padx = 5)

        # Clear Button
        ttk.Button(controls_frame, text="Clear Canvas", command=self.clear_canvas).grid(row=0, column=8, padx=5)

        # Details Button (Placeholder - Functionality described in JSON)
        ttk.Button(controls_frame, text="Details", command=self.show_details).grid(row=0, column=9, padx=5)

        # Canvas
        self.canvas = tk.Canvas(self.root, bg=self.canvas_color, height=600, width=800, highlightthickness=0)
        self.canvas.pack(expand=tk.YES, fill=tk.BOTH)

        # Initialize PIL Image
        self.current_image = Image.new("RGB", (800, 600), self.canvas_color)
        self.draw = ImageDraw.Draw(self.current_image)


    def paint(self, event):  # Drawing functionality
        if self.drawing_tool == "brush":
            self.draw_brush(event)
        elif self.drawing_tool == "line":
            self.draw_line(event)
        elif self.drawing_tool == "rectangle":
            self.draw_rectangle(event)
        elif self.drawing_tool == "ellipse":
            self.draw_ellipse(event)

    def draw_brush(self, event):
        if self.old_x and self.old_y:
            if self.eraser_on:
                color = self.canvas_color
            else:
                color = self.brush_color
            self.canvas.create_line(self.old_x, self.old_y, event.x, event.y,
                                    width=self.brush_width, fill=color,
                                    capstyle=tk.ROUND, smooth=tk.TRUE, splinesteps=36)
            self.draw.line([self.old_x, self.old_y, event.x, event.y],
                           width=self.brush_width, fill=color, joint="round")
        self.old_x = event.x
        self.old_y = event.y

    def draw_line(self, event):
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        if self.old_x and self.old_y:
            self.canvas.create_line(self.old_x, self.old_y, event.x, event.y, width=self.brush_width, fill=self.brush_color, capstyle=tk.ROUND, smooth=tk.TRUE)
            self.draw.line([self.old_x, self.old_y, event.x, event.y], width=self.brush_width, fill=self.brush_color, joint="round")

    def draw_rectangle(self, event):
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        if self.old_x and self.old_y:
            self.canvas.create_rectangle(self.old_x, self.old_y, event.x, event.y, width=self.brush_width, outline=self.brush_color)
            self.draw.rectangle([self.old_x, self.old_y, event.x, event.y], width=self.brush_width, outline=self.brush_color)

    def draw_ellipse(self, event):
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        if self.old_x and self.old_y:
            self.canvas.create_oval(self.old_x, self.old_y, event.x, event.y, width=self.brush_width, outline=self.brush_color)
            self.draw.ellipse([self.old_x, self.old_y, event.x, event.y], width=self.brush_width, outline=self.brush_color)

    def start_drawing(self, event):
        self.old_x = event.x
        self.old_y = event.y

    def reset(self, event):
        self.old_x = None
        self.old_y = None

    def change_brush_size(self, event): #Update brush size
        self.brush_width = int(self.brush_width_scale.get())

    def choose_color(self): #Brush color selector
        color_code = colorchooser.askcolor(initialcolor=self.brush_color)
        if color_code[1]:
            self.brush_color = color_code[1]

    def choose_canvas_color(self): #Background color selector
        color_code = colorchooser.askcolor(initialcolor=self.canvas_color)
        if color_code[1]:
            self.canvas_color = color_code[1]
            self.canvas.config(bg=self.canvas_color)
            # Update PIL Image background
            self.current_image = Image.new("RGB", (800, 600), self.canvas_color)
            self.draw = ImageDraw.Draw(self.current_image)

    def change_drawing_tool(self, event): #Update drawing tool
        self.drawing_tool = self.tool_combo.get()

    def toggle_eraser(self):  #Eraser functionality
        self.eraser_on = not self.eraser_on

    def clear_canvas(self): #Clear canvas
        self.canvas.delete("all")
        self.current_image = Image.new("RGB", (800, 600), self.canvas_color)
        self.draw = ImageDraw.Draw(self.current_image)

    def save_image(self): #Save Image Function
        file_path = filedialog.asksaveasfilename(defaultextension=".png")
        if file_path:
            self.current_image.save(file_path)
            messagebox.showinfo("Image Saved", "Image saved successfully!")

    def show_details(self):
        messagebox.showinfo("Details", "Please check the JSON response for a detailed explanation of QuantumSketchpad.")


if __name__ == "__main__":
    root = tk.Tk()
    app = QuantumSketchpad(root)
    root.mainloop()
👁️ Viewed: 8

Comments