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

目录

1.认识Python

2.环境与工具

2.1 python环境

2.2 Visual Studio Code编译

3.制作一个绘图板

3.1 代码构思

3.2 代码实例

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 osclass SimplePaint:def __init__(self, root):# 初始化self.root = rootself.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 = Noneself.old_y = Noneself.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 = Falseself.color = colorchooser.askcolor(color=self.color)[1]def clear_canvas(self):# 清除画布self.canvas.delete("all")def use_eraser(self):# 启用橡皮擦self.eraser_on = Truedef insert_text(self):# 插入文本self.eraser_on = Falsetext = 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 = Falseimage_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 = Falseself.draw_shape = "line"def draw_circle(self):# 画圆self.eraser_on = Falseself.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.xself.old_y = event.ydef 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.xself.old_y = event.ydef on_button_release(self, event):# 鼠标释放事件处理self.old_x = Noneself.old_y = Noneif __name__ == "__main__":root = tk.Tk()app = SimplePaint(root)root.mainloop()

3.3 运行结果

4.总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第12天| 基于MindNLP+MusicGen生成自己的个性化音乐

之前都是看图文类的东西&#xff0c;今天体验一点不一样的。来点听力的内容。 mindspore有音乐生成模型MusicGen&#xff0c;MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采…

京东金融大数据分析平台总体架构:剖析和解读

京东金融大数据分析平台总体架构&#xff1a;剖析和解读 在现代金融行业中&#xff0c;大数据分析已成为决策支持和业务创新的重要工具。京东金融凭借其强大的大数据分析平台&#xff0c;成功地将海量数据转化为洞察力&#xff0c;为企业和用户提供优质服务。本文将深入探讨京…

代码随想录训练营第二十九天 134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列

第一题&#xff1a; 原题链接&#xff1a;134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 需要三个变量&#xff0c;一个变量start记录结果也就是出发的第一个加油站&#xff0c;一个变量curSum来记录此时加油耗油后剩余的油量&#xff0c;如果发现c…

微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端

微前端&#xff08;Micro Frontends&#xff09;是将前端应用拆分成多个独立、可部署的部分&#xff0c;每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用&#xff0c;是为了应对复杂前端应用的维护和扩展问题而提出的。 来龙去脉 背景…

【吴恩达机器学习-week2】可选实验:使用 Scikit-Learn 进行线性回归

支持我的工作 &#x1f389; &#x1f4c3;亲爱的朋友们&#xff0c;感谢你们一直以来对我的关注和支持&#xff01; &#x1f4aa;&#x1f3fb; 为了提供更优质的内容和更有趣的创作&#xff0c;我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐&#xf…

库表设计(基础)-实体与设计关系

实体关系分析 1 实体关系是指系统事务之间的联系。 2 实体关系需要双向分析。 3 实体关系决定表关系。 实体关系的种类 1 一对一 2 一对多 3 多对多 举例&#xff1a; 上面关系如下&#xff1a; 班级和学生 &#xff1a; 1:N 学生和课程&#xff1a;N : N 学生和学籍档案&a…

MISRA C 和MISRA C++:汽车软件安全的守护者

一、MISRA C与C语言 自1972年Dennis MacAlistair Ritchie在美国贝尔实验室创造C语言以来&#xff0c;它已成为当今最流行的编程语言之一。C语言以其使用的灵活性、功能的丰富性而广受欢迎&#xff0c;但同时也因其宽松的语法和不严格的数据类型给开发的产品带来了安全隐患。 …

如何批量给文件名添加编号?这个方法速度快!操作简单!

如何批量给文件名添加编号&#xff1f;这个方法速度快&#xff01;操作简单&#xff01;批量给文件重命名&#xff0c;这个是在工作中和生活中经常要用到的一个小技巧&#xff0c;许多人还不知道怎么操作&#xff0c;当然如果要按一定的格式和规律重命名大量的文件&#xff0c;…

Linux内核 -- 多核通信之RPMSG驱动使用

Linux Kernel RPMsg 驱动注册流程的高级用法与注意事项 在Linux Kernel中&#xff0c;RPMsg&#xff08;Remote Processor Messaging&#xff09;是一种用于不同处理器之间通信的机制&#xff0c;通常用于多核系统中的通信&#xff0c;如主处理器和协处理器之间的消息传递。了…

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读

巴西电子游戏PWA借助海外快手kwai社交广告出海趋势解读 在数字化时代的浪潮中&#xff0c;电子游戏行业蓬勃发展&#xff0c;而广告投放策略也随之日新月异。特别是在巴西这样一个充满活力的市场&#xff0c;电子游戏的普及与流行程度不容小觑。在这样的背景下&#xff0c;在数…

java数据结构集合复习之ArrayList与顺序表

前言: 这是我最一年学习java的一部分的回顾总结 1.List 1.1什么是List? 在框架集合中,List是一个接口,继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示 --------boolean add(E e)尾插 evoid a…

[pwn]静态编译

静态编译 1. 栈足够大的情况下 程序在ida打开后&#xff0c;左侧的函数栏目没有红色&#xff08;系统调用的函数&#xff09;&#xff0c;而只有一些静态函数&#xff0c;通常这类文件的大小会必普通的pwn题程序要大得多。 这种静态编译的题没有调用库函数&#xff0c;也就没…

百度云智能媒体内容分析一体机(MCA)建设

导读 &#xff1a;本文主要介绍了百度智能云MCA产品的概念和应用。 媒体信息海量且复杂&#xff0c;采用人工的方式对视频进行分析处理&#xff0c;面临着效率低、成本高的困难。于是&#xff0c;MCA应运而生。它基于百度自研的视觉AI、ASR、NLP技术&#xff0c;为用户提供音视…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

2024年【四川省安全员B证】考试及四川省安全员B证考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】考试及四川省安全员B证考试题&#xff0c;包含四川省安全员B证考试答案和解析及四川省安全员B证考试题练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及四川省安全员B证…

golang项目中gorm框架的配置和具体使用

最近在改造golang项目&#xff0c;从postgre数据库迁移到达梦数据库&#xff0c;我还想在改造后的项目使用 gorm 操作数据库&#xff0c;保持较小的改动。查找了不少资料&#xff0c;最终从以下两篇文章中借鉴了不少 1、Gorm 入门介绍与基本使用 这篇知乎文章详细介绍了 gorm 框…

C语言 -- 操作符详解​

C语言 -- 操作符详解​ 1. 操作符的分类2. 二进制和进制转换​2.1 2进制转10进制​2.1.1 10进制转2进制数字​ 2.2 2进制转8进制和16进制​2.2.1 2进制转8进制​2.2.2 2进制转16进制​ 3. 原码、反码、补码​4. 移位操作符​4.1 左移操作符​ 4.2 右移操作符​5. 位操作符&…

Symfony实战手册:PHP框架的高级应用技巧

引言 Symfony是一个功能强大且广泛应用于PHP应用程序开发的框架&#xff0c;它提供了许多高级特性和工具&#xff0c;可以帮助开发人员更高效地构建和管理复杂的Web应用程序。以下是Symfony框架的几个关键方面及其高级应用技巧&#xff1a; 1. 路由和控制器 Symfony的路由组…

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分组成&#xff0c; action, header, options action,决定当前规则匹配上后需要执行的动作header,定义当前规则的协议&#xff0c;IP地址&#xff0c;端口&#xff0c;方向options,定义了具体的规则 一、 action 合法的action值有&#x…

Linux_共享内存通信

目录 1、共享内存原理 2、申请共享内存 2.1 ftok 2.2 测试shmget、ftok 2.3 查看系统下的共享内存 3、关联共享内存 3.1 测试shmat 4、释放共享内存 4.1 测试shmctl 5、实现共享内存通信 6、共享内存的特性 结语 前言&#xff1a; 在Linux下&#xff0c;有一…