学会python——用python制作一个绘图板(python实例十九)

目录

1.认识Python

2.环境与工具

[2.1 python环境](#2.1 python环境)

[2.2 Visual Studio Code编译](#2.2 Visual Studio Code编译)

3.制作一个绘图板

[3.1 代码构思](#3.1 代码构思)

[3.2 代码实例](#3.2 代码实例)

[3.3 运行结果](#3.3 运行结果)

4.总结


1.认识Python

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象脚本语言

Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字或标点符号,它具有比其他语言更有特色的语法结构。

2.环境与工具

2.1 python环境

在Windows上使用命令行窗口查看所安装的python版本

复制代码
python --version

2.2 Visual Studio Code编译

Visual Studio Code是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和Git 版本控制系统。

3.制作一个绘图板

3.1 代码构思

使用tkinter模块,利用canvas控件进行绘制,然后使用画布控件,获取鼠标按键、移动、释放的操作。

3.2 代码实例

复制代码
import tkinter as tk
from tkinter import colorchooser, filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import os

class SimplePaint:
    def __init__(self, root):
        # 初始化
        self.root = root
        self.root.title("Simple Paint-简单绘图板-Zucker")
        self.root.geometry("800x600")
        
        # 创建画布
        self.canvas = tk.Canvas(root, bg="white", width=800, height=600)
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        # 初始化变量
        self.old_x = None
        self.old_y = None
        self.color = "black"
        self.eraser_on = False
        
        # 设置菜单和绑定事件
        self.setup_menu()
        self.setup_bindings()
        
    def setup_menu(self):
        # 设置菜单
        menu = tk.Menu(self.root)
        self.root.config(menu=menu)
        
        # 文件菜单
        file_menu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="File", menu=file_menu)
        file_menu.add_command(label="Open", command=self.open_image)
        file_menu.add_command(label="Save", command=self.save_image)
        file_menu.add_separator()
        file_menu.add_command(label="Exit", command=self.root.quit)
        
        # 编辑菜单
        edit_menu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Edit", menu=edit_menu)
        edit_menu.add_command(label="Clear All", command=self.clear_canvas)
        edit_menu.add_command(label="Erase", command=self.use_eraser)
        edit_menu.add_command(label="Insert Text", command=self.insert_text)
        edit_menu.add_command(label="Insert Image", command=self.insert_image)
        
        # 形状菜单
        shape_menu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Shapes", menu=shape_menu)
        shape_menu.add_command(label="Draw Line", command=self.draw_line)
        shape_menu.add_command(label="Draw Circle", command=self.draw_circle)
        
        # 颜色菜单
        color_menu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label="Color", menu=color_menu)
        color_menu.add_command(label="Choose Color", command=self.choose_color)
        
    def setup_bindings(self):
        # 绑定画布事件
        self.canvas.bind("<ButtonPress-1>", self.on_button_press)
        self.canvas.bind("<B1-Motion>", self.on_paint)
        self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
        
    def choose_color(self):
        # 选择颜色
        self.eraser_on = False
        self.color = colorchooser.askcolor(color=self.color)[1]
        
    def clear_canvas(self):
        # 清除画布
        self.canvas.delete("all")
        
    def use_eraser(self):
        # 启用橡皮擦
        self.eraser_on = True
        
    def insert_text(self):
        # 插入文本
        self.eraser_on = False
        text = tk.simpledialog.askstring("Input", "Enter text to insert:")
        if text:
            self.canvas.create_text(400, 300, text=text, font=("Arial", 20), fill=self.color)
        
    def insert_image(self):
        # 插入图片
        self.eraser_on = False
        image_path = filedialog.askopenfilename()
        if image_path:
            img = Image.open(image_path)
            img = img.resize((200, 200), Image.ANTIALIAS)
            self.img = ImageTk.PhotoImage(img)
            self.canvas.create_image(400, 300, image=self.img, anchor=tk.CENTER)
        
    def draw_line(self):
        # 画线
        self.eraser_on = False
        self.draw_shape = "line"
        
    def draw_circle(self):
        # 画圆
        self.eraser_on = False
        self.draw_shape = "circle"
        
    def open_image(self):
        # 打开图片
        image_path = filedialog.askopenfilename()
        if image_path:
            img = Image.open(image_path)
            self.img = ImageTk.PhotoImage(img)
            self.canvas.create_image(0, 0, image=self.img, anchor=tk.NW)
        
    def save_image(self):
        # 保存图片
        file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png"), ("All files", "*.*")])
        if file_path:
            # 保存画布内容为 PNG 图片
            self.canvas.postscript(file=file_path + '.eps')
            img = Image.open(file_path + '.eps')
            img.save(file_path, "png")
            os.remove(file_path + '.eps')
        
    def on_button_press(self, event):
        # 鼠标按下事件处理
        self.old_x = event.x
        self.old_y = event.y
        
    def on_paint(self, event):
        # 鼠标移动事件处理
        paint_color = self.color if not self.eraser_on else "white"
        if self.old_x and self.old_y:
            self.canvas.create_line(self.old_x, self.old_y, event.x, event.y, fill=paint_color, width=5, capstyle=tk.ROUND, smooth=tk.TRUE)
        self.old_x = event.x
        self.old_y = event.y
        
    def on_button_release(self, event):
        # 鼠标释放事件处理
        self.old_x = None
        self.old_y = None
        
if __name__ == "__main__":
    root = tk.Tk()
    app = SimplePaint(root)
    root.mainloop()

3.3 运行结果

4.总结

通过定义多个函数来执行命令,并进行可视化操作,你也试试吧!

相关推荐
能来帮帮蒟蒻吗几秒前
Go语言学习(15)结构体标签与反射机制
开发语言·笔记·学习·golang
维度攻城狮2 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
陈皮话梅糖@2 小时前
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
开发语言·javascript·flutter
简简单单做算法2 小时前
基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
人工智能·python·深度学习·算法·分类·mediapipe·限定半径最近邻分类树
hvinsion3 小时前
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
开发语言·python·自动化·自动化任务管理
Aphelios3803 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
qq_529835353 小时前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
日暮南城故里4 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码
Vitalia4 小时前
从零开始学Rust:枚举(enum)与模式匹配核心机制
开发语言·后端·rust
飞飞翼4 小时前
python-flask
后端·python·flask