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