Thursday, August 14, 2025

Tahsin's Open Source Python Paint Software with Tkinter (Tahsin's Software)

๐Ÿงช Features Included

  • ๐Ÿ–Œ️ Freehand painting with adjustable color
  • ⬛ Rectangle drawing
  • ⚪ Circle drawing
  • ๐Ÿ“ฆ Simulated 3D box with shading
  • ๐ŸŽจ Color picker
  • ๐Ÿงผ Canvas clearing

๐ŸŽจ Tahsin's Open Source Python Paint Software with Tkinter

import tkinter as tk
from tkinter import colorchooser

class PaintApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Tahsin's Python Paint Software")

        self.current_tool = "paint"
        self.current_color = "black"
        self.start_x = None
        self.start_y = None

        # Canvas setup
        self.canvas = tk.Canvas(root, bg="white", width=800, height=600)
        self.canvas.pack(fill=tk.BOTH, expand=True)

        # Tool buttons
        tool_frame = tk.Frame(root)
        tool_frame.pack()

        tk.Button(tool_frame, text="Paint", command=lambda: self.select_tool("paint")).pack(side=tk.LEFT)
        tk.Button(tool_frame, text="Rectangle", command=lambda: self.select_tool("rectangle")).pack(side=tk.LEFT)
        tk.Button(tool_frame, text="Circle", command=lambda: self.select_tool("circle")).pack(side=tk.LEFT)
        tk.Button(tool_frame, text="3D Box", command=lambda: self.select_tool("3d")).pack(side=tk.LEFT)
        tk.Button(tool_frame, text="Choose Color", command=self.choose_color).pack(side=tk.LEFT)
        tk.Button(tool_frame, text="Clear", command=self.clear_canvas).pack(side=tk.LEFT)

        # Bind mouse events
        self.canvas.bind("<ButtonPress-1>", self.on_press)
        self.canvas.bind("<B1-Motion>", self.on_drag)
        self.canvas.bind("<ButtonRelease-1>", self.on_release)

    def select_tool(self, tool):
        self.current_tool = tool

    def choose_color(self):
        color = colorchooser.askcolor()[1]
        if color:
            self.current_color = color

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

    def on_press(self, event):
        self.start_x = event.x
        self.start_y = event.y
        if self.current_tool == "paint":
            self.canvas.create_oval(event.x, event.y, event.x+1, event.y+1, fill=self.current_color, outline=self.current_color)

    def on_drag(self, event):
        if self.current_tool == "paint":
            self.canvas.create_oval(event.x, event.y, event.x+5, event.y+5, fill=self.current_color, outline=self.current_color)

    def on_release(self, event):
        if self.current_tool == "rectangle":
            self.canvas.create_rectangle(self.start_x, self.start_y, event.x, event.y, outline=self.current_color)
        elif self.current_tool == "circle":
            self.canvas.create_oval(self.start_x, self.start_y, event.x, event.y, outline=self.current_color)
        elif self.current_tool == "3d":
            # Simulate a 3D box with shaded lines
            x1, y1, x2, y2 = self.start_x, self.start_y, event.x, event.y
            offset = 20
            # Front face
            self.canvas.create_rectangle(x1, y1, x2, y2, outline=self.current_color)
            # Back face
            self.canvas.create_rectangle(x1+offset, y1-offset, x2+offset, y2-offset, outline=self.current_color)
            # Connect corners
            self.canvas.create_line(x1, y1, x1+offset, y1-offset, fill=self.current_color)
            self.canvas.create_line(x2, y1, x2+offset, y1-offset, fill=self.current_color)
            self.canvas.create_line(x1, y2, x1+offset, y2-offset, fill=self.current_color)
            self.canvas.create_line(x2, y2, x2+offset, y2-offset, fill=self.current_color)

# Run the app
if __name__ == "__main__":
    root = tk.Tk()
    app = PaintApp(root)
    root.mainloop()

No comments:

Post a Comment

Mini RDBMS (with persistent storage) using only Python Standard Library

Mini RDBMS (with persistent storage) using only the Python Standard Library import re import json import os from typing import Any, Dict, Li...